我有一个网址我想发布一些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
。
答案 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'}