将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。