C#如何遍历复杂嵌套JSON并追加指定值后保持原键序序列化回JSON
实现方案
以下是基于Python的完整实现,完全满足你「反序列化→更新数据→序列化」的需求,且全程保留原有键的顺序:
前置说明
Python 3.7+ 原生字典默认保留插入顺序,低于该版本可通过collections.OrderedDict保证顺序,无需引入第三方依赖。
完整代码
import json from collections import OrderedDict def recursive_update(node, extra_mapping): """递归遍历所有嵌套节点,匹配divName后追加额外属性""" if isinstance(node, dict): # 匹配当前节点的divName,存在对应配置则追加属性(不打乱原有键顺序) if "divName" in node and node["divName"] in extra_mapping: node.update(extra_mapping[node["divName"]]) # 递归遍历当前字典的所有值 for value in node.values(): recursive_update(value, extra_mapping) elif isinstance(node, list): # 递归遍历列表内的所有元素 for item in node: recursive_update(item, extra_mapping) if __name__ == "__main__": # 1. 反序列化原始JSON,保留原有键顺序 with open("input.json", "r", encoding="utf-8") as f: origin_data = json.load(f, object_pairs_hook=OrderedDict) # 2. 加载待追加的映射配置 with open("extra.json", "r", encoding="utf-8") as f: extra_config = json.load(f) # 3. 执行递归更新 recursive_update(origin_data, extra_config) # 4. 序列化回JSON,保持原有格式与顺序 with open("output.json", "w", encoding="utf-8") as f: json.dump( origin_data, f, ensure_ascii=False, indent=2, sort_keys=False # 必须关闭,否则会自动按键名排序打乱原有顺序 )
关键特性
- 支持任意深度的递归嵌套,不管是
pay25嵌套还是dynamicValue下的节点都能完整扫描 - 追加的属性会放在当前节点原有属性的末尾,完全不会修改原有键的顺序
- 自动处理字典、列表两类嵌套结构,覆盖你给出的JSON内所有嵌套场景
- 输出缩进、格式和原始JSON完全一致
可选扩展:反序列化为类对象
如果你需要用类对象(支持.操作符访问属性)替代字典操作,可以引入pydantic库实现强类型映射,配置如下即可保证顺序:
from pydantic import BaseModel, ConfigDict class BaseNode(BaseModel): model_config = ConfigDict(extra="allow", populate_by_name=True) # 按需添加已知字段的类型定义即可,未知字段会自动保留
内容的提问来源于stack exchange,提问作者Fosk
相关产品推荐
相关产品推荐

