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不是对象,则直接替换值
        }
    }
}
相关推荐
人工智能训练师1 小时前
Ubuntu22.04如何安装新版本的Node.js和npm
linux·运维·前端·人工智能·ubuntu·npm·node.js
灿烂阳光g1 小时前
domain_auto_trans,source_domain,untrusted_app
android·linux
Seveny071 小时前
pnpm相对于npm,yarn的优势
前端·npm·node.js
yddddddy2 小时前
css的基本知识
前端·css
昔人'2 小时前
css `lh`单位
前端·css
Ronin3053 小时前
【Linux系统】日志与策略模式
linux·策略模式·日志
ZzzK,3 小时前
JAVA虚拟机(JVM)
java·linux·jvm
Nan_Shu_6144 小时前
Web前端面试题(2)
前端
知识分享小能手4 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
Aspiresky4 小时前
浅析Linux进程信号处理机制:基本原理及应用
linux·运维·信号处理