Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用NewtonSoft从C#中的另一个json替换json?_C#_Json_Json.net - Fatal编程技术网

如何使用NewtonSoft从C#中的另一个json替换json?

如何使用NewtonSoft从C#中的另一个json替换json?,c#,json,json.net,C#,Json,Json.net,我有两个JSON对象- json1 = { "payload": { "firstName": "John", "lastName": "Doe", "code": "test1", "arrayProp1": [1, 2, 3], "arr

我有两个JSON对象-

json1 = {
    "payload": {
        "firstName": "John",
        "lastName": "Doe",
        "code": "test1",
        "arrayProp1": [1, 2, 3],
        "arrayProp2": [{
                "prop1": "value1",
                "prop2": "value2"
            },
            {
                "prop1": "2_value1",
                "prop2": "2_value2"
            }
        ]
    }
}

json2 = {
    "payload": {
        "code": "newCode",
        "arrayProp1": [3,4],
        "arrayProp2": [{
                "prop1": "newValue1",
                "prop2": "newValue2"
            }
        ]
    }
}
如果我使用内置的merge(
json1.merge(json2)
),得到的结果是-

result : {
    "payload": {
        "firstName": "John",
        "lastName": "Doe",
        "code": "newCode",
        "arrayProp1": [1, 2, 3, 3, 4],
        "arrayProp2": [{
                "prop1": "value1",
                "prop2": "value2"
            },
            {
                "prop1": "newValue1",
                "prop2": "newValue2"
            },
            {
                "prop1": "2_value1",
                "prop2": "2_value2"
            }
        ]
    }
}
预期结果-

{
    "payload": {
        "firstName": "John",
        "lastName": "Doe",
        "code": "newCode",
        "arrayProp1": [3, 4],
        "arrayProp2": [{
            "prop1": "newValue1",
            "prop2": "newValue2"
        }]
    }
}
我想根据json2中提供的值替换json1的父属性值

我试图写一个函数,这是我目前的版本-

string Merge(string req1, string req2) {
    try
                {
                    JObject json1 = JObject.Parse(req1);
                    JObject json2 = JObject.Parse(req2);                
    
                    foreach (var a in json2.DescendantsAndSelf())
                    {
                        if (a is JObject obj)
                        {
                            foreach (var prop in obj.Properties())
                            {
                                if(json1.SelectTokens(prop.Path).Any())
                                {
                                    json1[prop.Path] = prop.Value;
                                }
                            }
                        }
                        
                    }
                    req1 = json1.ToString();
                }
                catch(Exception ex)
                {
                    //do nothing
                }
return req1; }
这里有两个问题-

  • “payload”被标识为property,json1被json2完全替换,因此我丢失了它的一些属性
  • 在被替换之后,当循环继续运行时,比如说要更新属性'code',那么属性路径是payload.code,因此在json1[prop.path]=prop.Value行上,它不更新有效负载中的现有代码,而是创建一个名为payload.code的新属性,其值为“newcode”
  • 上面代码的最终结果是-

    {
        "payload": {
            "code": "newCode",
            "arrayProp1": [3, 4],
            "arrayProp2": [{
                "prop1": "newValue1",
                "prop2": "newValue2"
            }],
            "payload.code": "newCode",
            "payload.arrayProp1": [3, 4],
            "payload.arrayProp2": [{
                "prop1": "newValue1",
                "prop2": "newValue2"
            }],
            "payload.arrayProp1[0].prop1": "newValue1",
            "payload.arrayProp1[0].prop2": "newValue2"
        }
    }
    

    有人能帮我一下吗?

    您的要求是在将两个JSON对象合并到一起时,数组内容被替换,而不是连接起来。您可以通过以下设置来实现这一点:

    Concat 0连接数组。
    Union 1 Union数组,跳过已存在的项。
    替换2替换所有数组项。
    合并3个合并数组项,按索引匹配。
    

    特别是
    MergeArrayHandling.Replace
    将根据需要工作:

    json1.Merge(json2, new JsonMergeSettings 
                { 
                    MergeArrayHandling = MergeArrayHandling.Replace 
                });
    

    演示小提琴。

    您是否尝试了
    合并阵列处理。替换
    ?看。@dbc我没有。我也没有看到那个帖子。让我看一下,看看上面写的是什么。谢谢大家!<代码>合并阵列处理。替换
    有效,请参阅。作为一个副本关闭此问题就足够了吗?或者您想要一个专门针对
    MergeArrayHandling.Replace
    ,而另一个Q&a没有这样做吗?@dbc是的,这是有效的。非常感谢你。我没有看到重载合并函数,正在尝试编写自己的逻辑。非常感谢。你能不能把这个作为答案贴出来,这样我就可以接受了?