c#json仅合并值(忽略缺少的字段)

时间:2018-09-25 11:29:49

标签: c# .net json.net

我正在使用NewtonsoftJson库,正在尝试合并两个json对象。但是所需的结果不是通常的合并,而是更多的添加或更新。例如,我有以下对象:

对象1:

{
  'FirstName': 'John',
  'LastName': 'Smith',
  'Enabled': false,
  'Roles': [ 'User' ]
}

对象2:

{
  'FirstName': 'Harry',
  'Enabled': true,
  'Age': 29,
  'Roles': [ 'User', 'Admin' ]
}

结果应类似于:

{
  "FirstName": "Harry",
  "LastName": "Smith",
  "Enabled": true,
  'Roles': [ 'User', 'Admin' ]
}

没有AGE字段。我只想更新现有字段的值,而我想忽略新的字段(在第一个字段中不存在)-在这种情况下,字段:Age。 图书馆似乎没有提供这种行为。

对于自定义实现,至少由于类型不同,看起来确实很难。例如,在一种情况下,它可能只是一个数字,在其他情况下,它可能是数组等。 有任何想法吗 ?

2 个答案:

答案 0 :(得分:1)

您可以列出第一个对象的所有属性,然后与第二个对象进行比较。如果在第二个对象中找到该属性,则取值,否则从第一个对象中取值:

static void Main(string[] args)
{
    var obj = JObject.Parse(@"{'FirstName': 'John',
                               'LastName': 'Smith',
                               'Enabled': false,
                               'Roles': [ 'User' ]}");

    var obj2 = JObject.Parse(@"{'FirstName': 'Harry',
                                'Enabled': true,
                                'Age': 29,
                                'Roles': [ 'User', 'Admin' ]}");

    var propertyNames = obj.Properties().Select(p => p.Name);

    var result = new JObject();

    foreach (var property in propertyNames)
    {
        JToken value;
        if (!obj2.TryGetValue(property, out value))
            value = obj.GetValue(property);

        result.Add(property, value);
    }

    Console.WriteLine(result.ToString());
}

结果:

enter image description here

答案 1 :(得分:1)

您可能想将Json反序列化为JObject,并且在实现IEnumerable<KeyValuePair<>>时,您可以简单地使用foreach循环对其进行迭代:

JObject obj;
JObject updateWith;

foreach (var token in updateWith)
{
   if (obj.ContainsKey(token.Key))
   {
      obj[token.Key] = token.Value;
   }
}