Python JSON解码错误求助:通过代码修正格式错误的JSON
修正错误JSON并解析的Python方案
问题分析
你遇到的json.decoder.JSONDecodeError核心原因是内部大括号内不是合法的JSON对象(缺少键值对的冒号),同时存在数字未加引号的情况。原错误JSON中,每个ID对应的大括号内是逗号分隔的列表元素,而非"key": value格式,这才是触发Expecting ':' delimiter的直接原因。
修正思路
- 针对内部非法大括号:要么替换为数组
[...]保留序列结构,要么给每个元素补充对应键,转成标准对象格式。 - 给数字添加双引号(按需转为字符串类型)。
- 通过Python代码批量修正后,验证解析合法性。
代码实现
方案1:转成数组形式(保留原序列结构)
适合仅需修正格式、不需要添加键的场景:
import re import json # 错误的JSON字符串 invalid_json = '''{"3704969059":{"Lunar Moth Headwings",100,1680750150,500,"https://tr.rbxcdn.com/5c0a02da770746e4ac9a1760d427f716/150/150/Hat/Png"},"13114264635":{"Cow Beret",70,1682603172,200,"https://tr.rbxcdn.com/7d39a32f04f00844113f4b3ab355517a/150/150/Hat/Png"},"13160317604":{"Insignia Helmet",2500,1682593511,25,"https://tr.rbxcdn.com/55feabd27486feb51eb4f0db2209fecf/150/150/Hat/Png"}}''' # 步骤1:将内部非法大括号替换为数组括号 step1 = invalid_json.replace('{"', '["').replace('"}', '"]') # 步骤2:给独立数字添加双引号 step2 = re.sub(r'(?<![\w"])(\d+)(?![\w"])', r'"\1"', step1) # 步骤3:修正格式冗余问题 final_json = step2.replace('[""', '["').replace('""]', '"]') # 解析验证 try: data = json.loads(final_json) print("解析成功:") print(json.dumps(data, indent=2)) except json.JSONDecodeError as e: print(f"修正后仍有错误:{e}")
方案2:转成带键的对象形式(符合JSON规范)
适合需要明确数据含义、后续方便处理的场景:
import re import json invalid_json = '''{"3704969059":{"Lunar Moth Headwings",100,1680750150,500,"https://tr.rbxcdn.com/5c0a02da770746e4ac9a1760d427f716/150/150/Hat/Png"},"13114264635":{"Cow Beret",70,1682603172,200,"https://tr.rbxcdn.com/7d39a32f04f00844113f4b3ab355517a/150/150/Hat/Png"},"13160317604":{"Insignia Helmet",2500,1682593511,25,"https://tr.rbxcdn.com/55feabd27486feb51eb4f0db2209fecf/150/150/Hat/Png"}}''' # 提取每个ID对应的内部元素 pattern = r'"(\d+)":\{([^}]+)\}' matches = re.findall(pattern, invalid_json) # 构建合法JSON结构 valid_data = {} # 自定义每个元素对应的键 keys = ["name", "price", "timestamp", "stock", "image_url"] for item_id, elements_str in matches: elements = [elem.strip().strip('"') for elem in elements_str.split(',')] item_data = dict(zip(keys, elements)) # 按需将数字转回数值类型 # item_data["price"] = int(item_data["price"]) # item_data["timestamp"] = int(item_data["timestamp"]) # item_data["stock"] = int(item_data["stock"]) valid_data[item_id] = item_data # 输出并验证 valid_json = json.dumps(valid_data, indent=2) print(valid_json) try: json.loads(valid_json) print("\n解析成功") except json.JSONDecodeError as e: print(f"\n错误:{e}")
说明
- 方案1快速修正格式,所有数字转为字符串,保留原始序列顺序。
- 方案2更具可读性和扩展性,给数据赋予明确含义,可根据需求调整数字类型。
内容的提问来源于stack exchange,提问作者Aarush Kumar
相关产品推荐
相关产品推荐

