【问题标题】:How to Deserialize JSON data? C#如何反序列化 JSON 数据? C#
【发布时间】:2016-05-14 13:39:49
【问题描述】:

我从 API 获取 Json 数据,我一直在尝试反序列化。

Json 数据:

{
   "items": [
      {
         "id": "1",
         "name": "samplename",
         "AddressList1": {
            "City": "Hyd",
            "State": "TN",
            "Country": "IN"
         },
         "Age": "10"
      },
      {
         "id": "2",
         "name": "samplename2",
         "AddressList1": {
            "City": "Hydd",
            "State": "TN",
            "Country": "IN"
         },
         "Age": "10"
      }
   ],
   "paging": {
      "cursors": {}
   }
}

实体:

public class AddressList1
{
    public string City { get; set; }
    public string State { get; set; }
    public string Country { get; set; }
}

public class Item
{
    public string id { get; set; }
    public string name { get; set; }
    public AddressList1 addressList1 { get; set; }
    public string Age { get; set; }
}

public class Cursors
{
}

public class Paging
{
    public Cursors cursors { get; set; }
}

public class Users
{
    public List<Item> items { get; set; }
    public Paging paging { get; set; }
}

C#代码:

JsonConvert.DeserializeObject<List<Users>>(content);

错误信息:

无法反序列化当前 JSON 对象(例如 {"name":"value"}) 进入类型'System.Collections.Generic.List`1 [Entities.Users]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。

我哪里做错了?

【问题讨论】:

  • 如果向下滚动,通常会在 json 中注明精确位置
  • 我认为它认为 "items": [ ... ] 是一个 JArray。 JSON 是由序列化相同的模型制成的吗?
  • 特别是,反序列化为 List&lt;T&gt; 仅在顶级值是 JSON 中的数组时才有意义。在您的情况下,它不是 - 它是一个具有两个属性(itemspaging)的对象。
  • @din 试过了。还是不行

标签: c# json serialization json.net deserialization


【解决方案1】:

鉴于您的 JSON,您将需要一个包含项目成员和分页成员的 POCO 对象。

JsonConvert.DeserializeObject<Users>(content);

应该可以。

【讨论】:

    【解决方案2】:

    以下是一个 JSON 对象;在你的情况下User

    { ... }
    

    以下是一个 JSON 数组;在你的情况下,数组 User

    [ { ... }, { ... } ]
    

    因此,如果您想反序列化您进入用户数组的 JSON,这是不可能的,因为您在 JSON 中没有数组。

    因此反序列化的正确代码是:

    JsonConvert.DeserializeObject<Users>(content);
    

    此外,您的映射是错误的,因为在 JSON 中有一个属性 AddressList1,而在类中它被称为 addressList1

    【讨论】:

    • @KeerthiTeja 好的,那你可能拼错了。我尝试了你的 JSON,在 Item 我得到了 AddressList1(检查大小写)
    【解决方案3】:

    您的 Json 字符串格式正确,实体也符合 Json2Csharp 良好。

    但您的问题在于指令JsonConvert.DeserializeObject&lt;List&lt;Users&gt;&gt;(content);

    您拥有的所有 json 都只是 ONE 用户,而您正在尝试获取他们的列表,这就是问题所在,

    你可以试试:

    JsonConvert.DeserializeObject<Users>(content);
    

    【讨论】:

    • 这解决了我的问题。谢谢队友 :) 改为: public class Users { public Item[] items { get;放; } 公共分页 分页 { 获取;放; } } 和 JsonConvert.DeserializeObject(content);
    【解决方案4】:

    您的实体(模型)看起来不错。例如,如果您正在使用或将使用 ASP.NET Web API 2,并且您的客户端正在使用 http 动词 post,则此设置将起作用,因为 Web API 负责对象反序列化:

        public HttpStatusCode Post(Item item)
        {
           Debug.Write(item.toString());
           return HttpStatusCode.OK;
        }
    

    如果您坚持手动反序列化,请使用JavaScriptSerializer library,它允许您执行以下操作:

    Item item = new JavaScriptSerializer().Deserialize<Item>(content);
    

    请注意,.Deserialize&lt;T&gt;() 采用泛型,在您的情况下为 Item

    希望对您有所帮助。

    【讨论】:

      【解决方案5】:

      试试下面的代码

      JsonConvert.DeserializeObject<Users>(content);
      

      【讨论】:

        猜你喜欢
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多