如何在C#中反序列化JSON?

时间:2012-07-26 08:25:29

标签: json c#-4.0 deserialization

有人可以帮我正确地以这种格式反序列化json:

[
    {person: {name: "James", age:26}},
    {person: {name: "Mary", age:36}},
    {person: {name: "Kofi", age:46}}
]

我正在使用的代码如下:

WebRequest request = WebRequest.Create("url");
WebResponse response = request.GetResponse();

string json;

using (var sr = new StreamReader(response.GetResponseStream()))
{
    json = sr.ReadToEnd();
}

var serializer = new JavaScriptSerializer();

var persons= serializer.Deserialize<List<response>>(json);

foreach (var item in persons)
{
    Console.Write("name:" + item.name + " and age: " + item.age);
}

我要映射的课程如下:

public class person
{
    public string name{get;set;}
    public int age{get; set;}
}

public class response
{
   public person person {get;set;}
}

运行此代码时,我一直为名称和年龄属性获取空值和空字符串。如果有人可以帮助我,我会非常感激。

5 个答案:

答案 0 :(得分:5)

使用内置DataContractJsonSerializer类也是可能的。见例:

WebRequest request = WebRequest.Create("url");
WebResponse response = request.GetResponse();

using (Stream stream = response.GetResponseStream())
{
   Type serializationTargetType = typeof(List<person>);
   DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(serializationTargetType);

   List<person> jsonDeserialized = (List<person>)jsonSerializer.ReadObject(stream);
}

答案 1 :(得分:3)

解决方案

我的解决方案非常简单,但您必须安装:

nuget json

实施例

using Newtonsoft.Json;

var url = "http://your-url";
var json = JsonConvert.DeserializeObject<Person[]>(new WebClient().DownloadString(url));

List<Person> users = new List<Person>();

foreach (var user in json)
{
    users.Add(new Person()
    {
        name = user.name,
        age = user.age
    });
}

答案 2 :(得分:2)

您可以定义反映您的JSON结构的模型:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Row
{
    public Person Person { get; set; }
}

然后反序列化为一个行数组:

var serializer = new JavaScriptSerializer();
var rows = serializer.Deserialize<Row[]>(json);
foreach (var row in rows)
{
    Console.Write("name: {0} and age: {1}", row.Person.Name, row.Person.Age);
}

答案 3 :(得分:1)

我必须在foreach循环中调用item.person.name和item.person.age,并确保person类中的所有属性都是string类型。

答案 4 :(得分:0)

如果您需要的是从Web服务器反序列化响应,我会使用一些框架来完成所有这些。

我使用了http://restsharp.org/,效果很好。