我正在使用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。 图书馆似乎没有提供这种行为。
对于自定义实现,至少由于类型不同,看起来确实很难。例如,在一种情况下,它可能只是一个数字,在其他情况下,它可能是数组等。 有任何想法吗 ?
答案 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());
}
结果:
答案 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;
}
}