c#动态更新替换json节点

需求项目json作为主模板,会应用到多个子模版,当后续项目变更只需要修改主模板中节点,并且能够动态更新到原来的子模版中去。

主模板示例:

复制代码
{
	"A": {
		"A1": "",
		"A2": false,
		"A3": 1
	},
	"B": {
		"B1": "",
		"B2": false,
		"B3": 1
	},
	"C": {
		"C1": "",
		"C2": false,
		"C3": 1
	}
}

模板修改后:

复制代码
{
    "A": {
        "A1": "",
        "A2": true,
        "A3": 2,
        "A4": "NewValue"
    },
    "B": {
        "B1": "UpdatedValue",
        "B2": false,
        "B3": 1
    },
    "C": {
        "C1": "",
        "C2": false,
        "C3": 1
    },
    "D": {
        "D1": "",
        "D2": true,
        "D3": 3
    }
}

UpdateJObject 方法实现可以动态更新json,主模板节点存在则新增,不存在可以变更也可以选择更新数据值。

program:

cs 复制代码
static void Main(string[] args)
{
    string oldJson = "{\"A\":{\"A1\":\"\",\"A2\":false,\"A3\":1},\"B\":{\"B1\":\"\",\"B2\":false,\"B3\":1},\"C\":{\"C1\":\"\",\"C2\":false,\"C3\":1}}";
    string newJson = "{\"A\":{\"A1\":\"\",\"A2\":true,\"A3\":2,\"A4\":\"NewValue\"},\"B\":{\"B1\":\"UpdatedValue\",\"B2\":false,\"B3\":1},\"C\":{\"C1\":\"\",\"C2\":false,\"C3\":1},\"D\":{\"D1\":\"\",\"D2\":true,\"D3\":3}}";

    JObject oldObject = JObject.Parse(oldJson);
    JObject newObject = JObject.Parse(newJson);
    Console.WriteLine("更新前:" + oldObject.ToString(Newtonsoft.Json.Formatting.Indented));
    // 更新旧JSON对象
    UpdateJObject(oldObject, newObject);
    Console.WriteLine("存在则更新,不存在新增,更新后:" + oldObject.ToString(Newtonsoft.Json.Formatting.Indented));

    oldObject = JObject.Parse(oldJson);
    newObject = JObject.Parse(newJson);
    // 更新旧JSON对象
    UpdateJObject(oldObject, newObject, false);
    Console.WriteLine("存在则跳过,不存在新增,更新后:" + oldObject.ToString(Newtonsoft.Json.Formatting.Indented));

}

/// <summary>
/// 更新替换json节点
/// </summary>
/// <param name="target">被更新json</param>
/// <param name="source">源json</param>
/// <param name="isUpdateOriginalData">是否更新目标已存在的节点数据</param>
static void UpdateJObject(JObject target, JObject source, bool isUpdateOriginalData = true)
{
    foreach (var child in source)
    {
        JToken targetChild = target[child.Key];
        if (targetChild == null)
        {
            // 正确添加child到target
            target.Add(new JProperty(child.Key, child.Value));
        }
        else if (child.Value.Type == JTokenType.Object)
        {
            // 如果child是对象,则递归更新
            if (targetChild.Type == JTokenType.Object)
            {
                UpdateJObject(targetChild as JObject, child.Value as JObject, isUpdateOriginalData);
            }
            else
            {
                if (isUpdateOriginalData)
                    target[child.Key] = child.Value;// 如果targetChild不是对象,则替换整个值
            }
        }
        else
        {
            if (isUpdateOriginalData)
                target[child.Key] = child.Value;// 如果child不是对象,则直接替换值
        }
    }
}
相关推荐
wuhen_n40 分钟前
TypeScript 强力护航:PropType 与组件事件类型的声明
前端·javascript·vue.js
wuhen_n1 小时前
组件设计原则:如何设计一个高内聚、低耦合的 Vue 组件
前端·javascript·vue.js
Moment12 小时前
Vibe Coding 时代,到底该选什么样的工具来提升效率❓❓❓
前端·后端·github
IT_陈寒14 小时前
SpringBoot性能飙升200%?这5个隐藏配置你必须知道!
前端·人工智能·后端
小时前端14 小时前
React性能优化的完整方法论,附赠大厂面试通关技巧
前端·react.js
Nicko15 小时前
Jetpack Compose BOM 2026.02.01 解读与升级指南
前端
小蜜蜂dry15 小时前
nestjs学习 - 控制器、提供者、模块
前端·node.js·nestjs
优秀稳妥的JiaJi15 小时前
基于腾讯地图实现电子围栏绘制与校验
前端·vue.js·前端框架
前端开发呀15 小时前
从 qiankun(乾坤) 迁移到 Module Federation(模块联邦),对MF只能说相见恨晚!
前端