为了账号安全,请及时绑定邮箱和手机立即绑定

解析包含 \n\t\r 的 JSON 字符串

解析包含 \n\t\r 的 JSON 字符串

炎炎设计 2023-09-19 14:35:32
我正在使用 requests 库从 API 调用中获取一些数据,但它总是给我提供错误的 JSON 格式。然而,当我这样做时json.loads(),当我将其保存\r\t\n在文件中时,它在我的控制台窗口中是干净的。import requestsheaders = {    'Connection': 'keep-alive',    'Accept': '*/*',    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',    'X-Requested-With': 'XMLHttpRequest',    'Sec-Fetch-Site': 'same-origin',    'Sec-Fetch-Mode': 'cors',    'Sec-Fetch-Dest': 'empty',    'Referer': 'https://webapps.illinois.gov/IWCC/CaseDocket/CaseSearch/ResBirthEnquiry?Name=ILLINOIS%20STATE%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&type=R&caseDet=19_004185',    'Accept-Language': 'en-US,en;q=0.9',}params = (    ('Name', 'ILLINOIS STATE                '),    ('type', 'R'),    ('_', '1601313293712'),)response = requests.get('https://webapps.illinois.gov/IWCC/CaseDocket/CaseSearch/GetBirthInquiryDetails', headers=headers, params=params).json()with open('casedockets.json','w') as outfile:    json.dump(response, outfile, indent=4)它产生以下输出:"\"{\\r\\n\\\"nameBirthDetails\\\":\\r\\n{\\\"nameBirth10\\\":{\\r\\n\\t   \\\"petName\\\":\\\"MAURO, SEBASTIANO             \\\", \\r\\n\\t   \\\"respName\\\":\\\"ILLINOIS STATE                \\\", \\r\\n\\t   \\\"injuryDate\\\":\\\"11/21/2002\\\",\\r\\n\\t   \\\"caseYear\\\":\\\"03\\\", \\r\\n\\t   \\\"caseType\\\":\\\"WC\\\", \\r\\n\\t   \\\"caseSeqNbr\\\":\\\"003884\\\", \\r\\n\\t   \\\"dateFiled\\\":\\\"01/24/2003\\\", \\r\\n\\t   \\\"petBirthDate\\\":\\\"03/13/1943\\\", \\r\\n\\t^ 这只是 JSON 数据的一部分...我怎样才能使其成为有效的 JSON,以便提取我需要的密钥?
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

该网络服务器已被破坏,必须受到指责。它序列化了一个 JSON 对象,然后再次序列化它,可能使用第二个 json.dumps 或者可能是字符串的 python str 或 repr - 它们足够接近,很难分辨。当你这样做时,.json()你最终得到了原始的 json 序列化字符串。您json.dump刚刚再次进行了双重序列化。


json.loads您可以通过在转储之前添加一秒来解决该问题。如果服务器被修复,该步骤将失败,并且您会知道需要更新代码......因此添加异常处理。


import requests, json


headers = {

        'Connection': 'keep-alive',

        'Accept': '*/*',

        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',

        'X-Requested-With': 'XMLHttpRequest',

        'Sec-Fetch-Site': 'same-origin',

        'Sec-Fetch-Mode': 'cors',

        'Sec-Fetch-Dest': 'empty',

        'Referer': 'https://webapps.illinois.gov/IWCC/CaseDocket/CaseSearch/ResBirthEnquiry?Name=ILLINOIS%20STATE%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&type=R&caseDet=19_004185',

        'Accept-Language': 'en-US,en;q=0.9',

}

params = (

    ('Name', 'ILLINOIS STATE                '),

    ('type', 'R'),

    ('_', '1601313293712'),

)

response = requests.get('https://webapps.illinois.gov/IWCC/CaseDocket/CaseSearch/GetBirthInquiryDetails',

    headers=headers, params=params)

try:

    # buggy server returns doubly encoded json - until maybe someday it doesn't

    data = response.json()

    data = json.loads(data)

except TypeError:

    print("Looks like buggy server is no longer double encoded")

with open('casedockets.json','w') as outfile:

    json.dump(data, outfile, indent=4)


查看完整回答
反对 回复 2023-09-19
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

显然服务器也责任。由于评论线程而保留此答案。

requests不会为您解析 JSON,因此通过使用json.dump您可以将编码的 JSON 再次编码为 JSON 字符串。

只需outfile.write(response.read())将来自服务器的实际的、未修改的响应正文写入文件即可。

要解析 JSON 并从中获取 Python 对象,请使用response.json().



查看完整回答
反对 回复 2023-09-19
?
HUH函数

TA贡献1836条经验 获得超4个赞

这里的问题在于服务器返回请求内容的方式。使用转换对数据进行初始解析.json会生成字符串编码的 json 结构。使用json.loads它的函数将产生实际的 json 数据。第一个.json调用将整个字符串解释为 json 字符串,并根据规范返回该字符串。然后下一个调用采用现在对象绑定的 json 字符串并将其解释为正确的 json 对象。

最终,您每次都需要进行 json 解析,或者联系服务器管理员并告诉他们他们的 Web API 有缺陷。

解决方案: json.dump(json.loads(response))


查看完整回答
反对 回复 2023-09-19
  • 3 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信