求助:如何将非标准JSON格式字符串转为Python可使用的字典?
解决不规范类JSON转Python字典的问题
嘿,我之前也碰到过这种返回非标准JSON的接口,给你两个实用的解决思路:
方法一:用demjson库解析宽松格式JSON
demjson专门用来处理这种不严格的JSON格式(比如键没有双引号、末尾多逗号这类问题),非常省心。
步骤:
- 先安装库:
pip install demjson
- 修改你的代码,用
demjson.decode()替代标准的json.loads():
import requests import demjson def test(): url = "http://www.sgx.com/JsonRead/JsonstData" payload = { 'qryId': 'RSTIc', 'timeout': 60 } headers = { 'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)' } response = requests.post(url, data=payload, headers=headers) # 解析不规范的类JSON parsed_data = demjson.decode(response.text) print(type(parsed_data)) # 输出 <class 'dict'>,就是标准Python字典了
方法二:用正则手动补全双引号(无需第三方库)
如果不想额外安装库,可以用正则表达式给所有缺少双引号的键加上引号,再用标准json库解析。
修改后的代码示例:
import requests import json import re def test(): url = "http://www.sgx.com/JsonRead/JsonstData" payload = { 'qryId': 'RSTIc', 'timeout': 60 } headers = { 'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)' } response = requests.post(url, data=payload, headers=headers) # 用正则给键加上双引号(适配字母、数字、下划线组成的键) fixed_json = re.sub(r'([a-zA-Z0-9_]+):', r'"\1":', response.text) # 现在可以用标准json库解析了 parsed_data = json.loads(fixed_json) print(type(parsed_data))
注意:这个正则只适用于键是字母、数字、下划线的情况,如果接口返回的键包含特殊字符,可能需要调整正则规则。
两种方法里,我更推荐第一种,demjson能处理更多边缘情况,比如字符串里包含冒号、单引号替代双引号这类问题,容错率更高。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

