如何将JSON响应转换为C#中的列表?

时间:2015-01-26 17:51:51

标签: c# json serialization

这可能是一个基本问题,但我在将JSON响应转换为List时遇到困难。 我正在获得JSON响应,

{"data":[{"ID":"1","Name":"ABC"},{"ID":"2","Name":"DEF"}]}

定义了一个类,

class Details
{
    public List<Company> data { get; set; }

}
class Company
{
    public string ID { get; set; }

    public string Name { get; set; }
}

试过这个转换,

List<Details> obj=List<Details>)JsonConvert.DeserializeObject
   (responseString,     typeof(List<Details>));

但这会返回错误,说

无法将当前JSON对象(例如{&#34; name&#34;:&#34; value&#34;})反序列化为类型System.Collections.Generic.List`1 [Client.Details ]&#39;因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。

要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是可以从JSON对象反序列化的集合类型,如数组或List)。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。

请帮忙!

3 个答案:

答案 0 :(得分:2)

您的JSON中未定义List<Detail>。您的JSON定义了一个 Detail记录,该记录本身有一个公司列表。

只需使用Details作为类型反序列化,而不是List<Details>(或者,如果可能的话,使JSON将单个详细记录包装成一个项目数组)。

答案 1 :(得分:0)

你需要像这样反序列化:

var Jsonobject = JsonConvert.DeserializeObject<Details>(json);

使用json2csharp.com生成的类:

var Jsonobject = JsonConvert.DeserializeObject<RootObject>(json);

你的课程应该是:

public class Datum
{
public string ID { get; set; }
public string Name { get; set; }
}

public class RootObject
{
public List<Datum> data { get; set; }
}

你总是可以使用json2csharp.com为json生成正确的类。

答案 2 :(得分:0)

您可以使用JavaScriptDeserializer

string json = @"{""data"":[{""ID"":""1"",""Name"":""ABC""},{""ID"":""2"",""Name"":""DEF""}]}";
Details details = new JavaScriptSerializer().Deserialize<Details>(json);
编辑:是的,OP的方法没有错,Servy的答案是正确的。您应该反序列化不是对象列表,而是反序列化包含该列表的类型