2014-11-14 50 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

相關問題