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());