在webhook中解析JSON

时间:2017-11-25 05:50:49

标签: python json python-3.x webhooks

我有一个网址我想发布一些JSON数据,但是我在解码数据时遇到了问题。我正在使用Postman来测试向webhook发送数据,我已经建立了一个系统来捕获webhook收到的内容。当我运行以下代码(python)时:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="right"
    android:layout_gravity="right"
    android:layout_marginTop="10dp"
    android:orientation="horizontal"
    android:layoutDirection="rtl"
    xmlns:android="http://schemas.android.com/apk/res/android">

我得到以下输出,存储在from urllib.parse import parse_qs data = parse_qs(request.body.decode()) 变量中:

data

我应该如何尝试解码JSON数据?我尝试使用{' name': [‘”keyOne”\r\n\r\nValueone\r\n——————————————494388199321720430876911\r\nContent-Disposition: form-data', ‘”keyTwo”\r\n\r\nValuetwo\r\n——————————————494388199321720430876911\r\nContent-Disposition: form-data', ‘”keyThree”\r\n\r\nValuethree\r\n——————————————494388199321720430876911--\r\n']} 时,我之前收到的错误是JSON object must be string not bytes

1 个答案:

答案 0 :(得分:1)

由于您尝试解析的数据似乎是多部分/表单数据,我认为最好的方法是cgi.parse_multipart。为此,您需要请求正文和边界,您可以使用cgi.parse_header从Content-Type标题中获取。

一个例子:

import cgi
from io import BytesIO
import requests

data = {'param1':'val1', 'param2':'val2'}
files = {'param3':('fname', 'fdata')}
r = requests.post('http://httpbin.org', data=data, files=files)

boundary = cgi.parse_header(r.request.headers['Content-Type'])[1]
boundary['boundary'] = boundary['boundary'].encode()
data = cgi.parse_multipart(BytesIO(r.request.body), boundary)
print(data)
  

{'param1':[b'val1'],'param2':[b'val2'],'param3':[b'fdata']}

结果是一个字典,其中包含字段名称和每个字段的值列表(以字节为单位) 然后,您可以解码data中的第一项值,以获得字符串的字典。

data = {k:v[0].decode() for k,v in data.items()}
print(data)
  

{'param1':'val1','param2':'val2','param3':'fdata'}