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不是对象,则直接替换值
        }
    }
}
相关推荐
芭拉拉小魔仙4 小时前
企业级Vue项目的状态管理:从原理到实战架构
前端·vue.js·架构
恋猫de小郭4 小时前
丰田正在使用 Flutter 开发游戏引擎 Fluorite
android·前端·flutter
daad7774 小时前
USB_抓包
linux·运维·服务器
扶苏10024 小时前
Vue 3 响应式原理深度解析
前端·javascript·vue.js
诚丞成4 小时前
指引代码方向的恒星:在代码的诗行中徜徉,Git工具的深邃与魅力
linux
NEXT064 小时前
React 性能优化:图片懒加载
前端·react.js·面试
PineappleCoder5 小时前
别让字体拖了后腿:FOIT/FOUT 深度解析与字体加载优化全攻略
前端·性能优化
未来之窗软件服务5 小时前
服务器运维(四十)日服务器linux-ps分析工具—东方仙盟
linux·运维·服务器·服务器运维·仙盟创梦ide·东方仙盟
NEXT065 小时前
后端跑路了怎么办?前端工程师用 Mock.js 自救实录
前端·后端·程序员
c++逐梦人5 小时前
ELF文件和动态链接与动态库加载
linux·操作系统·进程