反序列化JSON对象的一部分并将其序列化,其余属性保持不变

我有一些JSON,我想反序列化为C#类的实例。 但是,该类没有与原始JSON匹配的所有字段/属性。 我希望能够修改类中的属性值,然后将其序列化回JSON,其中原始JSON中的其余字段和属性仍然完好无损。

例如,假设我有以下JSON:

{ "name": "david", "age": 100, "sex": "M", "address": "far far away" } 

我想将它反序列化为这个类:

 class MyClass { public string name { get; set; } public int age { get; set; } } 

反序列化后,我设置以下内容:

 myClass.name = "John"; myClass.age = 200; 

现在,我想将它序列化回JSON并得到这个结果:

 { "name": "John", "age": 200, "sex": "M", "address": "far far away" } 

有没有办法使用Json.Net做到这一点?

您可以使用Json.Net的“扩展数据”function来处理此问题。

将新的Dictionary属性添加到类中,并使用[JsonExtensionData]属性进行标记。 (如果您不想影响类的公共接口,可以将其设为私有属性。)在反序列化时,此字典将填充与您的类的任何其他公共属性不匹配的任何数据。 在序列化时,字典中的数据将作为对象的属性写回JSON。

 class MyClass { public string name { get; set; } public int age { get; set; } [JsonExtensionData] private Dictionary otherStuff { get; set; } } 

这是一个演示:

 class Program { static void Main(string[] args) { string json = @" { ""name"": ""david"", ""age"": 100, ""sex"": ""M"", ""address"": ""far far away"" }"; MyClass obj = JsonConvert.DeserializeObject(json); Console.WriteLine("orig name: " + obj.name); Console.WriteLine("orig age: " + obj.age); Console.WriteLine(); obj.name = "john"; obj.age = 200; json = JsonConvert.SerializeObject(obj, Formatting.Indented); Console.WriteLine(json); } } 

输出:

 orig name: david orig age: 100 { "name": "john", "age": 200, "sex": "M", "address": "far far away" } 

好的,所以在发布问题之后,去吃午餐,回来后我找到了解决方案。 而不是使用JSON.nets“扩展数据”我发现他们有一个“合并”functionhttp://james.newtonking.com/archive/2014/08/04/json-net-6-0-release-4- JSON合并,dependency injection

IMO我认为这更清洁,并决定采用这种方法。

下面是我写的一个例子

 public class Cell { public string Text { get; set; } public int ID { get; set; } public CellStyle Style { get; set; } } public class CellStyle { public string BgColor { get; set; } public string TextColor { get; set; } } string json = @"{ 'Text': 'My Cell', 'ID': 20, 'TsID': 100, 'Style': { 'BgColor' : 'Red', 'TextColor' : 'Black', 'Caption' : 'Help My Cell', } }"; var orgCell = JsonConvert.DeserializeObject(json); orgCell.Style.TextColor = "White"; orgCell.Style.BgColor = "Blue"; var obj = JsonConvert.SerializeObject(orgCell); JObject o1 = JObject.Parse(json); JObject o2 = JObject.Parse(obj); o1.Merge(o2, new JsonMergeSettings { // union array values together to avoid duplicates MergeArrayHandling = MergeArrayHandling.Union }); o1.ToString(); // gives me the intended string