如何将二进制字符串解析成字典?

14

我有一个flask服务。有时候我会收到没有指向http标头的json消息。在这种情况下,我尝试从request.data中解析消息。但是request.data返回的字符串非常难以解析。它是一个二进制字符串,像这样:

b'{\n    "begindate": "2016-11-22", \n    "enddate": "2016-11-22", \n    "guids": ["6593062E-9030-B2BC-E63A-25FBB4723ECC", \n              "5A9F8478-6673-428A-8E90-3AC4CD764543", \n              "D8243BA1-0847-48BE-9619-336CB3B3C70C"]\n}'

当我尝试使用 json.loads() 时,出现了以下错误:
TypeError: the JSON object must be str, not 'bytes'

使用转换为字符串的函数(str())也不太好:

'b\'{\\n    "begindate": "2016-11-22", \\n    "enddate": "2016-11-22", \\n    "guids": ["6593062E-9030-B2BC-E63A-25FBB4723ECC", \\n              "5A9F8478-6673-428A-8E90-3AC4CD764543", \\n              "D8243BA1-0847-48BE-9619-336CB3B3C70C"]\\n}\''

我使用Python 3。我该如何解析request.data

1个回答

34

在将其传递给 json.loads 之前,只需对其进行解码:

b = b'{\n    "begindate": "2016-11-22", \n    "enddate": "2016-11-22", \n    "guids": ["6593062E-9030-B2BC-E63A-25FBB4723ECC", \n              "5A9F8478-6673-428A-8E90-3AC4CD764543", \n              "D8243BA1-0847-48BE-9619-336CB3B3C70C"]\n}'
r = json.loads(b.decode())
print(r)
{'begindate': '2016-11-22',
 'enddate': '2016-11-22',
 'guids': ['6593062E-9030-B2BC-E63A-25FBB4723ECC',
  '5A9F8478-6673-428A-8E90-3AC4CD764543',
  'D8243BA1-0847-48BE-9619-336CB3B3C70C']}

Python 3.x明确区分以下类型:

  • str = '...' 字面值 = Unicode字符序列(UTF-16或UTF-32,取决于Python的编译方式)

  • bytes = b'...' 字面值 = 八位字节序列(介于0和255之间的整数)

了解更多信息请点击此链接


如果user.body是代表Python字典的二进制对象,您也可以编写json.loads(user.body) - Franco Gil
你是一颗钻石伙计! - emanuel sanga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接