考虑下面的示例程序
var calendar = new Calendar
{
Id = 42,
CoffeeProvider = "Espresso2000",
Meetings = new[]
{
new Meeting
{
Location = "Room1",
From = DateTimeOffset.Parse("2014-01-01T00:00:00Z"),
To = DateTimeOffset.Parse("2014-01-01T01:00:00Z")
},
new Meeting
{
Location = "Room2",
From = DateTimeOffset.Parse("2014-01-01T02:00:00Z"),
To = DateTimeOffset.Parse("2014-01-01T03:00:00Z")
},
}
};
var patch = @"{
'coffeeprovider': null,
'meetings': [
{
'location': 'Room3',
'from': '2014-01-01T04:00:00Z',
'to': '2014-01-01T05:00:00Z'
}
]
}";
var patchedCalendar = Patch(calendar, patch);
Patch()
方法的结果应等于calendar
,除非由patch
更改.这意味着;Id
将保持不变,CoffeeProvider
将设置为 null
,Meetings
将包含位于 Room3 中的单个项目.
The result of the Patch()
method should be equal to calendar
except as changed by patch
. That means; Id
would be unchanged, CoffeeProvider
would be set to null
and Meetings
would contain a single item located in Room3.
如何创建一个通用的 Patch()
方法可反序列化的任何对象(不仅仅是示例 Calendar 对象)Json.NET?
How does one create a general Patch()
method that will work for
any object (not just the example Calendar object) deserializable by
Json.NET?
如果 (1) 这不可行,会有哪些限制使其可行以及如何实施?
If (1) this is not feasible, what would be some restrictions that would make it feasible and how would it be implemented?
你想要 JsonSerializer.Populate()
或其静态包装方法 JsonConvert.PopulateObject()
:
将 JSON 值填充到目标对象上.
Populates the JSON values onto the target object.
例如,这里它正在更新您的 Calendar
类的实例:
For instance, here it is updating an instance of your Calendar
class:
public static class TestPopulate
{
public static void Test()
{
var calendar = new Calendar
{
Id = 42,
CoffeeProvider = "Espresso2000",
Meetings = new[]
{
new Meeting
{
Location = "Room1",
From = DateTimeOffset.Parse("2014-01-01T00:00:00Z"),
To = DateTimeOffset.Parse("2014-01-01T01:00:00Z")
},
new Meeting
{
Location = "Room2",
From = DateTimeOffset.Parse("2014-01-01T02:00:00Z"),
To = DateTimeOffset.Parse("2014-01-01T03:00:00Z")
},
}
};
var patch = @"{
'coffeeprovider': null,
'meetings': [
{
'location': 'Room3',
'from': '2014-01-01T04:00:00Z',
'to': '2014-01-01T05:00:00Z'
}
]
}";
Patch(calendar, patch);
Debug.WriteLine(JsonConvert.SerializeObject(calendar, Formatting.Indented));
}
public static void Patch<T>(T obj, string patch)
{
var serializer = new JsonSerializer();
using (var reader = new StringReader(patch))
{
serializer.Populate(reader, obj);
}
}
}
产生的调试输出是:
{
"id": 42,
"coffeeprovider": null,
"meetings": [
{
"location": "Room3",
"from": "2014-01-01T04:00:00+00:00",
"to": "2014-01-01T05:00:00+00:00"
}
]
}
更新
如果你想先复制,你可以这样做:
If you want to copy first, you could do:
public static T CopyPatch<T>(T obj, string patch)
{
var serializer = new JsonSerializer();
var json = JsonConvert.SerializeObject(obj);
var copy = JsonConvert.DeserializeObject<T>(json);
using (var reader = new StringReader(patch))
{
serializer.Populate(reader, copy);
}
return copy;
}
这篇关于使用 Json.NET 使用新的部分 JSON 数据修改现有对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!