C# 从json反序列化,其中可以是单个T对象,也可以是列表中的T数组<;T>;
我有这样的代码:C# 从json反序列化,其中可以是单个T对象,也可以是列表中的T数组<;T>;,c#,asp.net,.net,json.net,C#,Asp.net,.net,Json.net,我有这样的代码: var json = GetJsonData(path); JObject event_dates_data = JObject.Parse(json); var event_dates_list = JObject.Parse(event_dates_data["document"]["date"].ToString()); var event_dates = JsonConvert.DeserializeObject<List<EventDate>>
var json = GetJsonData(path);
JObject event_dates_data = JObject.Parse(json);
var event_dates_list = JObject.Parse(event_dates_data["document"]["date"].ToString());
var event_dates = JsonConvert.DeserializeObject<List<EventDate>>(event_dates_list.ToString());
或:
我有“日期”的poco:
因此,当我尝试反序列化时,我得到一个异常:
无法反序列化当前JSON对象(例如{“name\”:\“value\”})
输入类型“System.Collections.Generic.List`1[TicketProvider.BrownPaperTickets.Entities.EventDate]”
因为类型需要JSON数组(例如[1,2,3])才能正确反序列化。\r\n
要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])
或者更改反序列化类型,使其成为普通的.NET类型
(例如,不是integer之类的基元类型,也不是数组或列表之类的集合类型)
可以从JSON对象反序列化的
键入以强制它从JSON对象反序列化。\r\n路径“date\u id”,第2行,位置13。“
如何将其放入列表?首先,在类中,将RootObject中的类实例转换为列表,例如:
class RootObject
{
public List<Class1> Property1 { get; set; }
}
类根对象
{
公共列表属性1{get;set;}
}
现在,您可以以列表的形式访问该类中的项目。我有点困惑,因为您在其中做的事情似乎太多了 我建议您创建一个将数据表示为类的对象。它应该有一个类型为
DateTime
的列表和一个类型为EventDate
的列表,当您序列化时,您只需将整个类序列化为:
var my_poco = // create your object here;
var poco_as_json = Newtonsoft.Json.JsonConvert.SerializeObject(my_poco);
// You then save that to a file (I assume that's what you're doing)
// Get it back will look like:
var back_from_json = Newtonsoft.Json.JsonConvert
.DeserializeObject<your_poco_class>(json);
// and then simply use the object's lists:
var dates = back_from_json.event_dates_list; // list of dates
var events = = back_from_json.events; // list of events?
var my\u poco=//在此处创建对象;
var poco_as_json=Newtonsoft.json.JsonConvert.SerializeObject(my_poco);
//然后将其保存到一个文件中(我假设您正在这样做)
//把它拿回来看起来像:
var back_from_json=Newtonsoft.json.JsonConvert
.DeserializeObject(json);
//然后简单地使用对象的列表:
var dates=back_from_json.event_dates_list;//日期表
var events==从_json.events返回_;//活动清单?
您的poco仅适用于活动日期。
您需要另一个具有变量的poco来完成其余部分: “文档”、“结果”、“结果代码”、“注释”、“总计日期”、“日期” 它可能被称为
document
,totaldates
将是一个int,而date
将是一个列表
这就是您要序列化和反序列化的内容。var json=GetJsonData(path);
var json = GetJsonData(path);
JObject event_dates_data = JObject.Parse(json);
var event_dates_list = JObject.Parse(event_dates_data["document"]["date"].ToString());
event_dates_list = string.Format("[{0}]", event_dates_list.Trim('[', ']'));
var event_dates = JsonConvert.DeserializeObject<List<EventDate>>(event_dates_list.ToString());
JObject event_dates_data=JObject.Parse(json);
var event_dates_list=JObject.Parse(event_dates_data[“document”][“date”].ToString());
event_dates_list=string.Format(“[{0}]”),event_dates_list.Trim('[',']');
var event_dates=JsonConvert.DeserializeObject(event_dates_list.ToString());
谢谢您的回答。我编辑了我的帖子,请再看一遍。。。原因?当然。。它起作用了。但是我认为Json.Net库应该有一些标准方法。使用JsonConverter
比手动操作Json并重新解析它要好得多。请参阅链接的重复问题和答案。您没有抓住问题的重点—有时属性是数组,有时是单个对象。如果将其声明为列表,那么当JSON只有一个对象时,它将不起作用,反之亦然。解决方案不仅仅是更改类声明(尽管这是它的一部分)。
class RootObject
{
public List<Class1> Property1 { get; set; }
}
var my_poco = // create your object here;
var poco_as_json = Newtonsoft.Json.JsonConvert.SerializeObject(my_poco);
// You then save that to a file (I assume that's what you're doing)
// Get it back will look like:
var back_from_json = Newtonsoft.Json.JsonConvert
.DeserializeObject<your_poco_class>(json);
// and then simply use the object's lists:
var dates = back_from_json.event_dates_list; // list of dates
var events = = back_from_json.events; // list of events?
var json = GetJsonData(path);
JObject event_dates_data = JObject.Parse(json);
var event_dates_list = JObject.Parse(event_dates_data["document"]["date"].ToString());
event_dates_list = string.Format("[{0}]", event_dates_list.Trim('[', ']'));
var event_dates = JsonConvert.DeserializeObject<List<EventDate>>(event_dates_list.ToString());