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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 05:54:06