2009-10-12 109 views
4

我有以下代碼和JSON:JSON.net問題JsonConvert.DeserializeObject

public class Labels 
{ 
    public Labels() 
    {} 

    public Label[] Label {get;set;} 
} 

public class Label 
{ 
    public Label() 
    { } 
    public string Name { get; set; } 
    public int TorrentsInLabel { get; set; } 
} 

//... 
Labels o = JsonConvert.DeserializeObject<Labels>(json); 
//... 


{"label": 
[ 
    ["seq1",1] 
    ,["seq2",2] 
]} 

我想此數組[ 「SEQ1」, 「1」]來反序列化爲Label對象。我錯過了什麼?一些屬性?

當我運行我得到異常:預期爲類型'test_JSONNET.Label'的JsonArrayContract,得到'Newtonsoft.Json.Serialization.JsonObjectContract'。

TNX

GG

+0

你試過「反映了」嗎? – 2009-10-12 10:32:18

+0

JSON.net是開源的,我現在正在通過代碼,但沒有到目前爲止。 – 2009-10-12 10:33:35

+0

建議:在開始查看源代碼之前,如何查看一些文檔? (http://james.newtonking.com/projects/json/help/) – Svish 2009-10-12 10:54:46

回答

2

默認情況下,類將序列化爲JSON對象,其中類的屬性變爲JSON對象的屬性。

{ 
    Name: "seq", 
    TorrentsInLabel: 1 
} 

你試圖序列化它到一個數組,這不是默認情況下Json.NET串行器的工作方式。

爲了得到你想要的,你應該創建一個JsonConverter和讀寫標籤的JSON手動是你希望它是(數組)什麼什麼。

3

JsonConvert怎麼能知道 「SEQ1」 對應的名稱, 「1」 對應的TorrentsInLabel?請查看JsonObjectAttribute,JsonPropertyAttribute,JsonArrayAttribute

+0

你確定嗎?它缺少Contract not Attribute。我試着把JsonArrayAttribute放在Label和JsonPropertyAttrbiute上Name和TorrentsInLabel,但是這些屬性需要屬性名稱。 – 2009-10-13 06:45:35

+0

你說得對。看來,最簡單的方法是在Label - IList或ICollection中實現一些收集界面。 – darkiri 2009-10-13 08:33:16

+0

是的,但我想從JSON數組到業務對象。 目前我通過繼承JsonCoverter實施的解決方案,但它不會是完美的。 – 2009-10-13 09:14:55