【问题标题】:How can I deserialize JSON in C#?如何在 C# 中反序列化 JSON?
【发布时间】:2012-07-26 08:25:29
【问题描述】:

有人可以帮助我以正确的方式反序列化这种格式的 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 和空字符串。如果有人能帮助我,我将不胜感激。

【问题讨论】:

  • 你正在映射到 person 类,但是在你的反序列化器中你使用了“auto”类?
  • 你确定这是有效的 JSON 吗?我认为你需要更多 " 来围绕 "person" 之类的东西
  • jsonlint.com 似乎同意我的观点
  • 我不得不在 foreach 循环中调用 item.person.name 和 item.person.age
  • Json Deserialize C#的可能重复

标签: json c#-4.0 deserialization


【解决方案1】:

也可以使用内置的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);
}

【讨论】:

  • 这行不通。 OP 显示的 JSON 结构不代表 person 的数组。所以使用person[] 作为类型会使序列化器崩溃。
【解决方案2】:

解决方案

我的解决方案很简单,但你一定已经安装了:

示例

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
    });
}

【讨论】:

    【解决方案3】:

    您可以定义反映您的 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);
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多