解析对JSON数据的HTTP响应

时间:2018-06-11 17:58:14

标签: python json http

对于noob问题感到抱歉,但需要帮助解析我在发布请求后收到的HTTP响应。

有例子:

import requests
import json
import base64
url = 'someURL'
if __name__=='__main__':
    data = '{"requests":"data"}'
    r = requests.post(url, data)
    print(r.content)
    print(r.encoding)

我收到了下一个:

  

b'{“结果”:[{“命中”:[{“别名”:[“古人的防御”   2“,”古人的防御2“,”\ xe0 \ xbc \ xbc \ xe3 \ x81 \ xa4   \ XE2 \ X97 \ x95_ \ XE2 \ X97 \ X95   \ xe0 \ XBC \ XBD \ XE3 \ X81 \ XA4 “],” 本地化 “:{},” 姓名 “:” 的Dota   2" , “流行度”:36184 “的objectID”: “29595”, “ highlightResult”:{ “别名”:[{ “值”:“防御   古人   2“,”matchLevel“:”none“,”matchedWords“:[]},{”value“:”the Defense of the the   古人   2" , “matchLevel”: “无”, “matchedWords”:[]},{ “值”:“\ xe0 \ XBC \ XBC   \ xe3 \ x81 \ xa4 \ xe2 \ x97 \ x95 \ xe2 \ x97 \ x95   \ xe0 \ XBC \ XBD \ XE3 \ X81 \ XA4" , “matchLevel”: “无”, “matchedWords”:[]}], “姓名”:{ “值”:“ Dota的   2" , “matchLevel”: “满”, “fullyHighlighted”:假 “matchedWords”:[ “DOTA”]}}},{ “别名”:[“暴雪   全明星“,”暴雪DOTA“,”HOTS“],”本地化“:{},”名称“:”英雄   的   风暴 “ ”人气“:27143, ”的objectID“: ”32959“, ”_ highlightResult“:{ ”别名“:[{ ”值“:” 暴雪   所有星 “ ”matchLevel“: ”无“, ”matchedWords“:[]},{ ”值“:” 暴雪    DOTA “ ”matchLevel“: ”满“, ”fullyHighlighted“:假 ”matchedWords“:[ ”DOTA“]},{ ”值“: ”HOTS“, ”matchLevel“:” 无“ ”matchedWords“:[]}], ”姓名“:{ ”值“:” 英雄   的   风暴 “ ”matchLevel“: ”无“, ”matchedWords“:[]}}},{ ”别名“:[], ”本地化“:{}, ”姓名“:” 藤子   F. Fujio人物Daishuugou! SF Dotabata   党! “ ”人气“:0 ”的objectID“: ”490150“, ”_ highlightResult“:{ ”名“:{ ”值“:” 藤子   F. Fujio人物Daishuugou! SF Dota bata   党!”, “matchLevel”: “满”, “fullyHighlighted”:假的, “matchedWords”: “DOTA”]}}},{ “别名”:[], “本地化”:{}, “名” :“\ xe5 \ X88 \ X80 \ xe5 \ XA1 \ X94 \ xe5 \ X82 \ XB3 \ xe5 \ xa5 \的x87   刀塔   传奇 “ ”人气“:0 ”的objectID“: ”488497“, ”_ highlightResult“:{ ”名“:{ ”值“:” \ xe5 \ X88 \ X80 \ xe5 \ XA1 \ X94 \ xe5 \ X82 \ XB3 \ xe5 \ xa5 \的x87    Dota的   传奇 “ ”matchLevel“: ”满“, ”fullyHighlighted“:假 ”matchedWords“:[ ”DOTA“]}}}], ”nbHits“:4, ”页“:0, ”nbPages“:1,” hitsPerPage “:1000,” processingTimeMS “:1,” 小面 “:{},” exhaustiveFacetsCount “:真” exhaustiveNbHits “:真,” 查询 “:” DOTA “ ”PARAMS“:” 查询= DOTA&安培;页= 0&安培; hitsPerPage = 99999&安培; numericFilters =%5B%5D&安培;小面= *&安培; facetFilters =”, “索引”: “游戏”}]} \ N'

     

UTF-8

但我如何尝试编码,格式化它仍然有不同的问题。请帮忙,这个请求如何获得有效的json?

有我的BAD例子:

print(j.json())
Traceback (most recent call last):
  File "./get_games.py", line 14, in <module>
    print(r.json())
UnicodeEncodeError: 'ascii' codec can't encode character '\u0f3c' in position 95: ordinal not in range(128)

或者这个:

json.loads(str(r.content)[1:])
Traceback (most recent call last):
  File "./get_games.py", line 17, in <module>
    a = json.loads(str(r.content)[1:])
  File "/usr/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

由于

1 个答案:

答案 0 :(得分:0)

您的报告中有些奇怪,因为打印j.json()会导致r.json()出现错误....

如果您没有使用str()进行隐式解码,那么您的第二次尝试就会奏效。

尝试明确,完全冗长的方式:

print(json.loads(r.content.decode(r.encoding)))