2014-04-23 65 views
1

我有兩個不同的Jsons表示的對象:解析版本JSON

JSON V1:

{ 
"names":[{"name":John},{"name":Eve}], 
"version": 1 
} 

JSON版:

{ 
    "names":[{"name":"John", "age":22},{"name":"Eve", "age":35}], 
    "version": 2 
} 

現在我有類可以解析的第一個版本Json:

[JsonObject("Class")] 
public class PeopleEntity 
{ 
    public string name{ get; set; } 
} 

public class People 
{ 
    public List<PeopleEntity> names{ get; set; } 
    public string version{ get; set; } 

} 

這是如何解析:

result = JsonConvert.DeserializeObject<People>(json_data, new  JsonSerializerSettings 
         { 
          DefaultValueHandling = DefaultValueHandling.Ignore 
         }); 

現在,問題是,解析第二版JSON的請求來了。什麼是解決這個問題的最佳解決方案?

我有一個想法,使接口列表(因爲屬性名稱,它總是存在),並使它的多個實現,每個版本的一個。

+0

那麼,這當然是一個使用json實現的問題。如果你自己推出,答案很簡單,但這可能很瘋狂。那麼你使用哪個JSON庫?你能夠/願意改變嗎?許多庫提供將字符串反序列化爲字典。然後你可以檢查字典,查看'version'並選擇相應的DTO類,然後可以從字典中獲取水分。 – mnemosyn

+0

@mnemosyn我用Newtonsoft庫。我無法改變包含的json。在解析它之前,我知道json的版本(它在文件名中)。 – Krivers

+1

如果您事先知道該版本,有什麼問題?只需序列化到正確的DTO類。 (去)序列化期間擁有兩個類比插入神祕邏輯更容易。保持序列化簡單,稍後再做翻譯,這是低耦合。 – mnemosyn

回答

0

我沒有看到任何需要接口來解決這個問題。

如果你想JSON的兩個版本反序列化爲同一類型,你可以爲null的年齡屬性添加到PersonEntity這樣的:

[JsonObject("Class")] 
public class PeopleEntity { 
    public string name { get; set; } 
    public int? age { get; set; } 
} 

通知的?int類型,這意味着該屬性可以爲空。使用Json.NET,如果您將v1 JSON反序列化到此類中,則name將按預期方式填充,並且age將保留爲空。

另外,由於您知道哪個版本的JSON先行反序列化,因此您可以爲每個版本使用不同的類型。使用v1的現有PeopleEntity類型,並創建派生類,爲v2添加age屬性。