如何按数组值对大型嵌套JSON进行分组?
实现方案(基于Python)
针对你这种大体积嵌套JSON的结构重组需求,以下是高效可行的处理方式:
1. 读取解析JSON
注意标准JSON要求键为字符串,你的示例中使用了数字键,Python的json模块会自动将其转为字符串键,可直接解析。如果原数据格式不标准,可改用demjson库兼容读取:
import json # 从文件读取数据 with open('your_data.json', 'r', encoding='utf-8') as f: raw_data = json.load(f)
2. 核心重组逻辑
遍历JSON的三层结构,将第二层的所有键合并为逗号分隔的字符串作为新键,再将对应第三层内容整合:
grouped_data = {} for top_key, middle_layer in raw_data.items(): # 拼接第二层所有键为新键 combined_middle_key = ','.join(middle_layer.keys()) # 处理第三层内容: # 情况1:第二层各键对应的第三层内容一致,直接取第一个值 combined_value = next(iter(middle_layer.values())) # 情况2:第二层内容不同,需合并所有第三层键值对 # combined_value = {} # for sub_dict in middle_layer.values(): # combined_value.update(sub_dict) grouped_data[top_key] = {combined_middle_key: combined_value}
3. 大文件内存优化
如果JSON文件过大无法一次性加载到内存,使用ijson进行流式处理,避免内存溢出:
import ijson grouped_data = {} with open('your_data.json', 'r', encoding='utf-8') as f: # 流式遍历顶层键值对 for top_key, middle_layer in ijson.kvitems(f, ''): combined_middle_key = ','.join(middle_layer.keys()) combined_value = next(iter(middle_layer.values())) grouped_data[top_key] = {combined_middle_key: combined_value}
4. 输出结果
将重组后的JSON写入文件:
with open('grouped_result.json', 'w', encoding='utf-8') as f: json.dump(grouped_data, f, indent=2, ensure_ascii=False)
关键注意点
- 若第二层不同键对应的第三层内容有冲突(比如同键不同值),需根据业务需求调整合并规则,比如保留所有值为数组、覆盖旧值等。
- Python 3.7+字典默认保留插入顺序,若需兼容旧版本,可使用
collections.OrderedDict维护键的顺序。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

