Modify existing object with new partial JSON data using Json.NET(使用 Json.NET 使用新的部分 JSON 数据修改现有对象)
问题描述
考虑下面的示例程序
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 数据修改现有对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 Json.NET 使用新的部分 JSON 数据修改现有对象
基础教程推荐
- SSE 浮点算术是否可重现? 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- rabbitmq 的 REST API 2022-01-01