2016-02-04 100 views
0

即时通讯从一个API获取Json数据,我一直试图反序列化。如何反序列化JSON数据? C#

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])来反序列化 正确。

我在哪里做错了?

+0

,通常在JSON的精确位置注意 – Plutonix

+0

我认为它认为“项目”:[...]是一个JArray。 JSON是由序列化相同的模型制成的? – Swen

+0

特别是,如果顶级值是JSON中的数组,则对列表进行反序列化才有意义。在你的情况下,它不是 - 它是一个具有两个属性('items'和'paging')的对象。 –

回答

3

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

{ ... } 

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

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

数组这样,因为你有没有JSON数组,如果你想你得到了JSON反序列化到用户的数组,这是不可能的。

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

JsonConvert.DeserializeObject<Users>(content); 

而且你的映射是错误的,因为在JSON有一个属性AddressList1,并在类被称为addressList1

+0

我用http://json2csharp.com/来生成实体 –

+0

@KeerthiTeja ok,那么你可能拼错了它。我试过你的JSON,并在'Item'中得到了'AddressList1'(检查大小写) –

1

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

JsonConvert.DeserializeObject<Users>(content); 

应该工作。

1

你的JSON字符串是好的格式化而且实体依据Json2Csharp也不错。

但你的问题是与指令JsonConvert.DeserializeObject<List<Users>>(content);

所有的JSON你只是ONE用户,而你试图让他们的名单,有问题,

你可以尝试使用:

JsonConvert.DeserializeObject<Users>(content); 
+0

这解决了我的问题。感谢队友:) 改为: public class Users { public Item [] items {get;组; } public Paging paging {get;组; } } and JsonConvert.DeserializeObject (content); –

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

希望有所帮助。

1

试试下面的代码

如果你向下滚动
JsonConvert.DeserializeObject<Users>(content);