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不是对象,则直接替换值
        }
    }
}
相关推荐
ll_god13 分钟前
ubuntu:beyond compare 4 This license key has been revoked 解决办法
linux·运维·ubuntu
凯子坚持 c27 分钟前
生产级 Rust Web 应用架构:使用 Axum 实现模块化设计与健壮的错误处理
前端·架构·rust
IT_陈寒33 分钟前
Python 3.12新特性实战:5个让你的代码效率翻倍的隐藏技巧!
前端·人工智能·后端
程序员小寒40 分钟前
前端高频面试题之Vuex篇
前端·javascript·面试
网硕互联的小客服1 小时前
如何解决 Linux 文件系统挂载失败的问题?
linux·服务器·前端·网络·chrome
凌波粒1 小时前
SpringMVC基础教程(2)--Controller/RestFul风格/JSON/数据转发和重定向
java·后端·spring·json·restful
程序员爱钓鱼2 小时前
Python 编程实战 · 实用工具与库 — Flask 路由与模板
前端·后端·python
合作小小程序员小小店5 小时前
web开发,在线%超市销售%管理系统,基于idea,html,jsp,java,ssh,sql server数据库。
java·前端·sqlserver·ssh·intellij-idea
不爱学英文的码字机器6 小时前
重塑 Web 性能:用 Rust 与 WASM 构建“零开销”图像处理器
前端·rust·wasm
浩星6 小时前
react的框架UmiJs(五米)
前端·javascript·react.js