2011-09-28 143 views
2

堆棧溢出:麻煩反序列化JSON對象爲

我使用JSON.NET都做得很成功之前,但是我現在運行到JSON的一個討厭的一點,我似乎無法反序列化。很明顯,問題在於如何構建類,因此我懇請某人幫助我規劃JSON.NET可以成功反序列化的類。

這裏是JSON字符串的結構:

[ 
    { 
     "name":"", 
     "cost":"", 
     "cmc":"", 
     "loyalty":"", 
     "supertype":"", 
     "type":"", 
     "subtype":"", 
     "power":"", 
     "toughness":"", 
     "hand":"", 
     "life":"", 
     "rule":"", 
     "multi":"", 
     "set": 
     [ // Note: there could be an infinite number of sets 
      { 
       "setcode":"", 
       "rarity":"", 
       "number":"", 
       "artist":"", 
       "flavor":"" 
      }, 
      { "setcode":"", 
       "rarity":"", 
       "number":"", 
       "artist":"", 
       "flavor":"" 
      }, 
     ] 
    } 
] 

非常感謝你,堆棧溢出

+0

嗯,我知道這是給我麻煩的設置信息。我試過了一個字符串數組和一個字典。 –

回答

2

你會希望有屬性的類爲所有這些名字。當涉及到數組時,它實際上是一個對象數組,所以您需要創建具有相同命名屬性的另一個類。喜歡的東西:

public class MainObject 
{ 
    public string name { get;set; } 
    // rest of the names as properties 
    public List<SetObject> @set { get;set; } 

} 

public class SetObject 
{ 
    public string setcode { get;set; } 
    // rest of your sets names as properties 
} 

此外,從您的JSON看起來它是一個數組已經所以你要反序列化作爲數組:

var objects = JsonConvert.DeserializeObject<MainObject[]>(/* your json here */); 

這會給你反序列化數組MainObject就像你的JSON是一個數組。

+0

非常感謝! –

+0

@smoak - 我認爲'@set'是爲了避免C#關鍵字衝突。我從來沒有見過這種語法。有趣。我通常只需添加一個JsonProperty屬性並指定Name。 – Frank

+0

@Frank - 你完全正確,在OP的情況下,他的JSON有一個名字「set」,而最簡單/最快捷的方法是創建一個具有同名屬性的類。由於屬性名稱(set)是C#關鍵字,所以您需要使用'@ set'來代替。 – smoak