1

有人可以帮助我以正确的方式以这种格式反序列化 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;}
}

运行此代码时,我不断收到 name 和 age 属性的 null 和空字符串。如果有人可以帮助我,我将不胜感激。

4

5 回答 5

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);
}
于 2012-07-26T08:56:58.053 回答
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
    });
}
于 2012-07-26T08:38:44.047 回答
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);
}
于 2012-07-26T09:26:15.853 回答
1

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

于 2012-07-26T09:32:37.090 回答
0

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

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

于 2012-07-26T09:13:50.830 回答