考虑下面的示例程序
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中的单个项目。
如何创建一种通用Patch()
方法,该方法适用于Json.NET可反序列化的任何对象(不仅是示例Calendar对象)?
如果(1)这不可行,将有哪些限制使其可行以及将如何实施?
您想要JsonSerializer.Populate()
它的静态包装器方法JsonConvert.PopulateObject()
:
将JSON值填充到目标对象上。
例如,这里正在更新您的Calendar
类的实例:
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"
}
]
}
更新资料
如果要先复制,则可以执行以下操作:
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数据反序列化为应用程序的对象。到现在为止还不错,因为JSON数据上的属性是静态的(带有值的键)。现在,我得到了一个结果,其中的关键是动态数据。 这是一个示例JSON网址: http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info 由此产生的JSON是: 好的
问题内容: 我有一个.NET项目。我正在使用JSON.NET库。我需要使用该库来解析一些JSON。我的JSON看起来像这样: 该对象实际上只是键/值对的列表。我试图弄清楚如何使用JSON.NET来1)解析此JSON和2)通过键/值对进行循环。有没有办法做到这一点?如果是这样,怎么办? 我唯一看到的是将反序列化为强类型的对象。 非常感谢! 问题答案: 您可以反序列化为 由于JObject实现,因此您
问题内容: 我正在与Json.Net解析数组。我正在尝试做的是将名称/值对从数组中拉出,并在解析JObject时将它们分配给特定的变量。 这是数组中的内容: 这是我在C#中获得的东西: 我是JSON和Json.Net的新手,因此它可能是其他人的基本解决方案。我基本上只需要在foreach循环中分配名称/值对,以便可以在前端输出数据。有人做过吗? 问题答案: 您可以这样获得数据值: 小提琴:http
问题内容: 假设我有一个来自jQuery的Ajax调用,如下所示: 我希望能够使用添加到myData 结果应该是所有ajax调用(发布和获取)都被修改,所以如果我得到一个额外的参数IsAjax = true 问题答案: 这篇博客文章解释了如何使用添加数据。累积起来 就像这样:
问题内容: 我一直在尝试使用json.net(https://dl.dropboxusercontent.com/u/2976553/json)解析json块,但是它未能说明json对象后面有文本。但是,如果您查看它在哪里引发异常 我检查了TokenType,它似乎不应该生成异常。我也修改了代码以使其忽略,但是它似乎没有解析任何内容。 我正在用这个.. 我已经将json粘贴到许多在线检查器中,他们
当我修改服务器中现有的excel文件并复制到本地计算机并打开它时,我发现excel无法打开,因为某些内容不可读,是否要打开并修复此工作簿 已经努力解决了8个小时,但运气不好。如果有人能解释一下,我会很感激的。