Python3如何增量分段解析JSON 仅提取第一层或指定键对应值
Python3 逐层级/按需解析JSON方案
场景1:仅提取指定顶级键对应的值(适合超大JSON文件)
优先使用第三方流式JSON解析库ijson,它采用增量解析逻辑,不需要将整个JSON加载到内存,仅解析你指定路径对应的数据段,内存占用极低。
- 安装依赖:
pip install ijson
- 代码示例:
import ijson import json # 直接从文件流解析,无需读取全量文件内容 with open("your_large_json.json", "rb") as f: # 提取顶级键fruits对应的值,解析到这部分后就会停止后续解析 fruits_value = next(ijson.items(f, "fruits")) # 如果你需要该值对应的原始JSON字符串,直接序列化即可 fruits_raw_json = json.dumps(fruits_value)
如果需要提取更深层级的内容,修改路径参数即可,比如提取fruits下的apple列表,路径改为fruits.apple即可。
注意:如果你的JSON文件体积过大无法一次性读入内存,优先选择本流式解析方案。
场景2:解析第一层所有键,对应值保留原始JSON字符串
如果你需要拿到第一层的所有键,且值保留未解析的原始JSON格式,可以基于标准库json的底层raw_decode方法实现,不需要额外安装依赖:
import json def parse_first_level(json_str: str) -> dict: decoder = json.JSONDecoder() pos = 0 result = {} # 匹配开头空白和左大括号 pos = json.decoder.WHITESPACE.match(json_str, pos).end() if json_str[pos] != "{": raise ValueError("仅支持顶级为对象的JSON") pos += 1 while True: pos = json.decoder.WHITESPACE.match(json_str, pos).end() if json_str[pos] == "}": break # 解析键 key, pos = decoder.raw_decode(json_str, pos) # 跳过冒号和前后空白 pos = json.decoder.WHITESPACE.match(json_str, pos).end() if json_str[pos] != ":": raise ValueError("JSON格式错误,缺少键后的冒号") pos += 1 pos = json.decoder.WHITESPACE.match(json_str, pos).end() # 记录值的起始位置,解析值得到结束位置后截取原始字符串 value_start = pos _, pos = decoder.raw_decode(json_str, pos) result[key] = json_str[value_start:pos].strip() # 跳过逗号和空白 pos = json.decoder.WHITESPACE.match(json_str, pos).end() if pos < len(json_str) and json_str[pos] == ",": pos += 1 return result
测试示例:
test_json = '''{"fruits": {"apple": ["golden delicious","pink lady","gala"], "mango": ["kent", "alfonso"]}, "vegetables": ["onions", "carrots", "celery"] }''' print(parse_first_level(test_json))
输出结果和你预期的结构完全一致。
内容的提问来源于stack exchange,提问作者Rushabh Mehta
相关产品推荐
相关产品推荐

