如何反序列化JSON数据? C#

时间:2016-02-04 19:11:17

标签: c# json serialization json.net deserialization

我从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对象(例如{&#34; name&#34;:&#34; value&#34;})   into type&#39; System.Collections.Generic.List`1 [Entities.Users]&#39;   因为该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。

我在哪里做错了?

5 个答案:

答案 0 :(得分:3)

以下是JSON对象;在您的情况下,User

{ ... }

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

的数组
[ { ... }, { ... } ]

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

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

JsonConvert.DeserializeObject<Users>(content);

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

答案 1 :(得分:1)

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

JsonConvert.DeserializeObject<Users>(content);

应该有用。

答案 2 :(得分:1)

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

但问题在于JsonConvert.DeserializeObject<List<Users>>(content);

指令

你所拥有的所有json只有 ONE 用户,并且你正在尝试获取它们的列表,有问题,

您可以尝试使用:

JsonConvert.DeserializeObject<Users>(content);

答案 3 :(得分:1)

尝试以下代码

JsonConvert.DeserializeObject<Users>(content);

答案 4 :(得分:0)

您的实体(型号)看起来很好。如果您正在使用或者使用ASP.NET Web API 2,并且您的客户端正在使用http谓词帖子,则此设置将起作用,因为Web API负责对象反序列化:

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

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

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

请注意,.Deserialize<T>()采用通用的,在您的情况下为Item

希望有所帮助。