 JSONDecodeError: Expecting value: line 1 column 1 (char 0),先加一行 print 看返回內(nèi)容)
代碼跑到j(luò)son.loads()這行報(bào)錯(cuò)json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)先別動(dòng)解析那行。在它上面加一行把拿到的東西打出來看rawresp.text# 你原本要解析的東西print(repr(raw[:100]))# 加這一行json.loads(raw)跑一遍看輸出是下面四種里的哪一種。一、輸出 ‘…’接口返回的是網(wǎng)頁repr(raw[:100]) - !DOCTYPE html\nhtmlheadtitle502 Bad Gateway/title/head\nbodyh1502 Bad Gateway/h1/bo - json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)多半是沒登錄被重定向或者撞上了 502 網(wǎng)關(guān)錯(cuò)誤頁。把狀態(tài)碼也打出來確認(rèn)print(resp.status_code)print(resp.headers.get(Content-Type))正常是200application/json??吹絫ext/html問題在接口那邊不在你的解析代碼。二、輸出 ‘’接口返回空raw repr(raw[:100]) - - json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)被限流了或者服務(wù)端異常返回空。解析前先判空ifnotrawornotraw.strip():raiseValueError(接口返回空狀態(tài)碼: %s%resp.status_code)三、輸出 “{‘name’: ‘tom’, ‘a(chǎn)ge’: 18}”喂了 Python 字典進(jìn)去raw {name: tom, age: 18} repr(raw[:100]) - {name: tom, age: 18} - json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)注意這里是column 2不是 column 1。這不是 JSON是 Python 字典被str()之后的樣子。數(shù)據(jù)本來在 Python 里就是 dict別json.loads直接用。確實(shí)是字符串用 astimportast objast.literal_eval(raw)# - {name: tom}別圖省事寫raw.replace(, )——數(shù)據(jù)里本來就帶單引號(hào)的話會(huì)被改壞。四、輸出 Extra data兩段 JSON 粘一起了raw {a: 1}{b: 2} repr(raw[:100]) - {a: 1}{b: 2} - json.decoder.JSONDecodeError: Extra data: line 1 column 9 (char 8)json.loads一次只認(rèn)一個(gè)完整的值。逐行解析forlineinraw.splitlines():ifline.strip():objjson.loads(line)print(obj)輸出{a: 1} {b: 2}記不住就看報(bào)錯(cuò)里的列號(hào)報(bào)錯(cuò)位置說明column 1 (char 0)開頭就不對(duì)空串或者 HTML 頁column 2 (char 1)單引號(hào)字典把 Python repr 喂進(jìn)去了Extra data多個(gè) JSON 粘一起Expecting , delimiterJSON 本身有語法錯(cuò)缺逗號(hào)或多逗號(hào)怎么算修好了接口正常返回時(shí)print(repr(raw[:100]))打出來的應(yīng)該是{開頭repr(raw[:100]) - {name: tom, age: 18} 解析結(jié)果 - {name: tom, age: 18}看到這個(gè)就對(duì)了。下次再撞上先把那一行 print 加上。喂飯教程到此結(jié)束完美