如何反序列化JSON数据? C#
即时通讯从一个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])来反序列化 正确。
我在哪里做错了?
以下是JSON对象;在你的情况a User
{ ... }
以下是一个JSON数组;你的情况的User
[ { ... }, { ... } ]
数组这样,因为你有没有JSON数组,如果你想你得到了JSON反序列化到用户的数组,这是不可能的。
因此反序列化正确的代码是:
JsonConvert.DeserializeObject<Users>(content);
而且你的映射是错误的,因为在JSON有一个属性AddressList1
,并在类被称为addressList1
我用http://json2csharp.com/来生成实体 –
@KeerthiTeja ok,那么你可能拼错了它。我试过你的JSON,并在'Item'中得到了'AddressList1'(检查大小写) –
鉴于您的JSON,您需要一个包含项目成员和分页成员的POCO对象。
JsonConvert.DeserializeObject<Users>(content);
应该工作。
你的JSON字符串是好的格式化而且实体依据Json2Csharp也不错。
但你的问题是与指令JsonConvert.DeserializeObject<List<Users>>(content);
所有的JSON你只是ONE用户,而你试图让他们的名单,有问题,
你可以尝试使用:
JsonConvert.DeserializeObject<Users>(content);
这解决了我的问题。感谢队友:) 改为: public class Users { public Item [] items {get;组; } public Paging paging {get;组; } } and JsonConvert.DeserializeObject
您的实体(模型)看起来很好。如果您正在使用或正在使用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
。
希望有所帮助。
试试下面的代码
如果你向下滚动JsonConvert.DeserializeObject<Users>(content);
,通常在JSON的精确位置注意 – Plutonix
我认为它认为“项目”:[...]是一个JArray。 JSON是由序列化相同的模型制成的? – Swen
特别是,如果*值是JSON中的数组,则对列表进行反序列化才有意义。在你的情况下,它不是 - 它是一个具有两个属性('items'和'paging')的对象。 –