2011-09-28 122 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