将JSON反序列化成一个对象
我有一些JSON:
{ "foo" : [ { "bar" : "baz" }, { "bar" : "qux" } ] }
我想将其反序列化为一个集合。 我已经定义了这个类:
public class Foo { public string bar { get; set; } }
但是,下面的代码不起作用:
JsonConvert.DeserializeObject<List<Foo>>(jsonString);
我如何反序列化我的JSON?
那个JSON不是一个Foo
JSON数组。 代码JsonConvert.DeserializeObject<T>(jsonString)
将从根上parsingJSONstring,并且您的typesT
必须完全匹配该JSON结构。 parsing器不会猜测哪个 JSON成员应该代表您正在查找的List<Foo>
。
您需要一个根对象,它代表根元素中的JSON。
您可以轻松地让这些类从样本JSON生成。 为此,请复制您的JSON并单击Edit -> Paste Special -> Paste JSON As Classes
在Visual Studio中将Edit -> Paste Special -> Paste JSON As Classes
。
另外,你也可以在http://json2csharp.com上做同样的事情,它可以产生或多或less相同的类。;
你会发现这个集合实际上是比预期更深的一个元素:
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
惯例,并为它们应用一个JsonProperty
属性:
public class Foo { [JsonProperty("bar")] public string Bar { get; set; } }
还要确保JSON包含足够的样本数据。 类parsing器将不得不根据JSON中的内容猜测适当的C#types。