最近在使用12306的API接口進(jìn)行二次開(kāi)發(fā)時(shí)遇到了一個(gè)問(wèn)題:json序列化失敗。
具體情況是,我在使用Python的requests庫(kù)進(jìn)行POST請(qǐng)求時(shí),返回的響應(yīng)結(jié)果是一個(gè)字符串,我需要將其轉(zhuǎn)換成Python對(duì)象進(jìn)行處理。因此,我使用json.loads()方法對(duì)響應(yīng)結(jié)果進(jìn)行解析,但是出現(xiàn)了如下錯(cuò)誤:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
經(jīng)過(guò)查找資料和調(diào)試,我發(fā)現(xiàn)是12306返回的響應(yīng)結(jié)果格式不規(guī)范,造成了json序列化失敗。具體原因可能是12306 API接口在返回響應(yīng)結(jié)果時(shí)沒(méi)有正確設(shè)置Content-Type為application/json,導(dǎo)致requests庫(kù)將返回內(nèi)容當(dāng)做普通字符串而非json字符串處理。
為了解決這個(gè)問(wèn)題,我在POST請(qǐng)求中增加了headers參數(shù),手動(dòng)設(shè)置Content-Type為application/json。代碼如下:
import requests import json url = 'https://kyfw.12306.cn/otn/leftTicket/queryX' data = { 'leftTicketDTO.train_date': '2022-01-01', 'leftTicketDTO.from_station': 'BJP', 'leftTicketDTO.to_station': 'SHH', 'purpose_codes': 'ADULT' } headers = { 'Content-Type': 'application/json' } response = requests.post(url=url, data=json.dumps(data), headers=headers) result = json.loads(response.text)
經(jīng)過(guò)測(cè)試,增加headers參數(shù)后,json序列化成功,問(wèn)題得到解決。