2017-06-22 64 views
1

我試圖將一串JSON數據轉換爲一個C#類對象。不過,我在本質上是動態的JSON的一小部分有問題。Json DeserializeObject到具有動態屬性的類

的JSON的部分是以下:

"contact": [{ 
    "comment": null, 
    "type": { 
     "id": "cell", 
     "name": "Example name" 
    }, 
    "preferred": true, 
    "value": { 
     "country": "7", 
     "formatted": "+7 (702) 344-3423-3", 
     "number": "3498908", 
     "city": "702" 
    } 
}, 
{ 
    "type": { 
     "id": "email", 
     "name": "Email example" 
    }, 
    "preferred": false, 
    "value": "[email protected]" 
}] 

C#類

public class Value 
{ 
    public string country { get; set; } 
    public string formatted { get; set; } 
    public string number { get; set; } 
    public string city { get; set; } 
} 

public class Type 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
} 

public class Contact 
{ 
    public string comment { get; set; } 
    public Type type { get; set; } 
    public bool preferred { get; set; } 
    public string value { get; set; } 
} 

C#代碼

Contact contact = JsonConvert.DeserializeObject<Contact>(result); 

的根據接觸信息 「值」 的變化的格式。是否可以將值映射爲字符串和類值?

感謝您提供任何幫助。

+0

對我來說,它看起來像你的類結構錯了。看起來像有一個基類Value和另外兩個類AddressValue和EmailValue。 –

回答

2

你可以從字面上只使用dynamic,即

public dynamic value { get; set; } 

如果它看起來像一個對象,它將被物化爲JObject,它可以通過dynamic API使用,所以.value.country將工作,等等。如果它看起來像一個整數,布爾或字符串:它將物化爲這樣。陣列也將被適當處理。所以:你可以檢查是否.value is string等。注意,這不會使用你的Value類型,這樣做更復雜,但是:meh;你得到的數據。你可以隨時手動切換。

如果您使用object而不是dynamic,則它的行爲也會如此,但是訪問內部屬性會更困難。

+0

謝謝馬克,這對我很有幫助。 我將房產更改爲 'public dynamic value {get;組; }' – user5498736

0

嘗試

​​

正如你可以在JSON看到,它的

"contact": [ 

指示陣列,目前你只是路過整個陣列

+0

我不認爲這是問題的關鍵;我認爲OP在說「這是一個更大的對象的一個​​片段」,其中有一個名爲'contact'的Contact []或List 。 –

0

除非您確定JSON始終具有相同的結構,否則最好使用dynamic變量而不是deserialize將其變爲類。

如果你喜歡上課,你可以使用reflection建立自己的runtime。但這就像用大炮殺死一隻蒼蠅,你可能不需要它,所以只需使用dynamic變量,它最適合於使用JSON字符串。