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)

TA貢獻1860條經驗 獲得超9個贊
顯然服務器也有責任。由于評論線程而保留此答案。
requests
不會為您解析 JSON,因此通過使用json.dump
您可以將編碼的 JSON 再次編碼為 JSON 字符串。
只需outfile.write(response.read())
將來自服務器的實際的、未修改的響應正文寫入文件即可。
要解析 JSON 并從中獲取 Python 對象,請使用response.json()
.

TA貢獻1836條經驗 獲得超4個贊
這里的問題在于服務器返回請求內容的方式。使用轉換對數據進行初始解析.json
會生成字符串編碼的 json 結構。使用json.loads
它的函數將產生實際的 json 數據。第一個.json
調用將整個字符串解釋為 json 字符串,并根據規范返回該字符串。然后下一個調用采用現在對象綁定的 json 字符串并將其解釋為正確的 json 對象。
最終,您每次都需要進行 json 解析,或者聯系服務器管理員并告訴他們他們的 Web API 有缺陷。
解決方案: json.dump(json.loads(response))
添加回答
舉報