将JSON反序列化为对象

时间:2015-12-11 11:32:59

标签: c# json json.net

我有一些JSON:

{
    "foo" : [ 
        { "bar" : "baz" },
        { "bar" : "qux" }
    ]
}

我想将其反序列化为一个集合。我已经定义了这个类:

public class Foo
{
    public string bar { get; set; }
}

但是,以下代码不起作用:

 JsonConvert.DeserializeObject<List<Foo>>(jsonString);

如何反序列化我的JSON?

1 个答案:

答案 0 :(得分:21)

JSON不是Foo JSON数组。代码JsonConvert.DeserializeObject<T>(jsonString)将从根目录解析JSON字符串 ,您的类型T必须与该JSON结构完全匹配。解析器不会猜测哪个 JSON成员应该代表您正在寻找的List<Foo>

您需要一个根对象,它表示根元素中的JSON。

您可以轻松地让类通过示例JSON生成。为此,请复制JSON并单击Visual Studio中的Edit -> Paste Special -> Paste JSON As Classes

或者,您可以在http://json2csharp.com上执行相同的操作,这会生成或多或少相同的类。

你会发现该集合实际上是一个比预期更深的元素:

public class Foo
{
    public string bar { get; set; }
}

public class RootObject
{
    public List<Foo> foo { get; set; }
}

现在您可以从根目录反序列化JSON(并确保将RootObject重命名为有用的东西):

var rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString);

访问该集合:

foreach (var foo in rootObject.foo)
{
    // foo is a `Foo`

}

您始终可以重命名属性以遵循约会惯例并对其应用JsonProperty属性:

public class Foo
{
    [JsonProperty("bar")]
    public string Bar { get; set; }
}

还要确保JSON包含足够的样本数据。类解析器必须根据JSON中找到的内容猜测适当的C#类型。