2014-11-14 112 views
2

我有一些JSON我想反序列化成C#类的一个实例。但是,该类没有与原始JSON匹配的所有字段/属性。我希望能够修改类中的属性值,然后将其序列化回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来做到这一点?

+0

这不正是你要寻找的,但这至少是一个解决方案,http://stackoverflow.com/questions/1207731/how-can- i-deserialize-json-to-a-simple-dictionarystring-string-in-asp-net – Shriike 2014-11-14 19:49:46

+1

你为什么不直接给类添加属性? – 2014-11-14 20:25:09

+0

@MikkoViitala他可能不知道其他属性究竟是什么,或者他们可能在名称和编号方面有所不同。 – 2014-11-14 20:48:54

回答

4

您可以使用Json.Net的“扩展数据”功能来处理这个问题。

将新的Dictionary<string, object>属性添加到您的班级并将其标记为[JsonExtensionData]属性。 (如果你不想影响你的类的公共接口,你可以使它成为一个私有属性。)在反序列化中,这个字典将填充任何与你的类的其他公共属性不匹配的数据。在序列化时,字典中的数据将作为对象的属性写回JSON。

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

    [JsonExtensionData] 
    private Dictionary<string, object> 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<MyClass>(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" 
} 
0

好,所以张贴的问题后,又到吃午饭,回来后我找到了解决办法。我发现他们有一个“合并”功能,而不是使用JSON.nets“扩展数据” http://james.newtonking.com/archive/2014/08/04/json-net-6-0-release-4-json-merge-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<Cell>(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 
+1

不知道为什么你认为这个更清洁。除了更加复杂,从性能的角度来看,你正在做两个额外的解析和合并。 – 2014-11-14 22:20:54

+0

我实际上并不确定使用哪种方法。由于JSON本身有多个嵌套图层,并且没有完全测试wyas,所以我担心。但至少我现在有办法解决这个问题 – vkom 2014-11-14 22:47:01

相关问题