如何将格式错误的类JSON数据转换为合法JSON用于Python代码?
将类JSON转换为合法JSON的Python方法
下面是几种解决这类非标准JSON解析问题的Python方法,涵盖内置模块、第三方库和手动处理方案:
1. 用内置ast模块(无需额外安装)
这类类JSON结构和Python字典几乎一致,ast.literal_eval可以安全解析成Python字典,再转成标准JSON。它比eval更安全,不会执行恶意代码。
import ast import json # 替换成你获取的类JSON字符串 raw_data = '''{ product_id: 11, user_id: 44, data: { "Wood shear wall design": { "Height of wall": { value: "4", unit: "ft" }, "Length of wall": { value: "4", unit: "ft" }, "Shear force": { value: "1000", unit: "lb" }, "sheathing grade": { value: '{"id":1136,"item":"Sheathing","section_product_item":"30_77"}', unit: "N/A", }, "sheathing material": { value: '{"id":1137,"item":"OBS","section_product_item":"30_77"}', unit: "N/A", }, "sheathing type": { value: '{"id":1138,"item":"3\/8","section_product_item":"30_77"}', unit: "N/A", }, "stud size": { value: '{"id":1139,"item":"2_3","section_product_item":"30_77"}', unit: "N/A", }, "number of nails": { value: "1", unit: "N/A" }, "stud type": { value: '{"id":1143,"item":"6d","section_product_item":"30_77"}', unit: "N/A", }, "nail spacing": { value: '{"id":1144,"item":"2","section_product_item":"30_77"}', unit: "ft", }, "modulus of elasticity": { value: "1", unit: "psf" }, "HD capacity": { value: "1", unit: "lb" }, "HD deflection": { value: "1", unit: "in" }, "number of opening": { value: '{"id":1149,"item":"0","section_product_item":"30_77"}', unit: "N/A", }, }, }, type: 1, number_of_projects: 1, }''' # 解析为Python字典 parsed_dict = ast.literal_eval(raw_data) # 转换为合法JSON字符串 valid_json = json.dumps(parsed_dict, indent=2) print(valid_json)
2. 用json5库
JSON5是JSON的超集,天生支持无引号键、单引号字符串等宽松语法,专门适配这类JS对象风格的数据。
先安装库:
pip install json5
代码示例:
import json5 # 使用上述raw_data字符串 parsed_data = json5.loads(raw_data) valid_json = json5.dumps(parsed_data, indent=2) print(valid_json)
3. 用demjson库
demjson的解码方法原生支持非严格JSON格式,能自动处理未加引号的键和单引号问题。
先安装库:
pip install demjson
代码示例:
import demjson parsed_data = demjson.decode(raw_data) valid_json = demjson.encode(parsed_data, indent=2) print(valid_json)
4. 手动正则替换(适合简单场景)
如果不想依赖第三方库,可通过正则修正语法问题:给无引号的键加双引号,替换字符串的单引号为双引号。
import re import json # 给未加引号的键添加双引号 pattern = re.compile(r'(\w+):') fixed_data = pattern.sub(r'"\1":', raw_data) # 替换包裹字符串的单引号为双引号 fixed_data = fixed_data.replace("'", '"') # 解析并转成标准JSON parsed_data = json.loads(fixed_data) valid_json = json.dumps(parsed_data, indent=2) print(valid_json)
注:正则方案适合结构简单的场景,复杂嵌套或特殊字符可能需要调整正则规则。
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

