You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python JSON解码错误求助:通过代码修正格式错误的JSON

修正错误JSON并解析的Python方案

问题分析

你遇到的json.decoder.JSONDecodeError核心原因是内部大括号内不是合法的JSON对象(缺少键值对的冒号),同时存在数字未加引号的情况。原错误JSON中,每个ID对应的大括号内是逗号分隔的列表元素,而非"key": value格式,这才是触发Expecting ':' delimiter的直接原因。

修正思路

  1. 针对内部非法大括号:要么替换为数组[...]保留序列结构,要么给每个元素补充对应键,转成标准对象格式。
  2. 给数字添加双引号(按需转为字符串类型)。
  3. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:02:49