从json反序列化,其中可以是单个T对象或T的数组到List <t> </t>

时间:2014-08-30 08:50:55

标签: 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>>(event_dates_list.ToString());

Json可能包含数组对象(例如&#34;日期:[{},{},{}]&#34;)或仅包含一个(例如&#34; date:{}&#34 ;)

杰森看起来像这样:

{
"document": {
"result": "success",
"resultcode": "000000",
"note": null,
"totaldates": "1",
"date": {
  "date_id": "351314",
  "live": "n",
  "datestart": "2012-03-07",
  "dateend": "2015-03-07",
  "timestart": "12:00",
  "timeend": "14:00",
  "date_available": "10000"
}
}
}

或者:

{
"document": {
"result": "success",
"resultcode": "000000",
"note": null,
"totaldates": "4",
"date": [
  {
    "date_id": "346022",
    "live": "n",
    "datestart": "2011-02-19",
    "dateend": "2011-02-19",
    "timestart": "12:00",
    "timeend": "14:00",
    "date_available": "10000"
  },
  {
    "date_id": "346023",
    "live": "n",
    "datestart": "2011-02-20",
    "dateend": "2011-02-20",
    "timestart": "12:00",
    "timeend": "14:00",
    "date_available": "10000"
  },
  {
    "date_id": "346024",
    "live": "n",
    "datestart": "2011-02-21",
    "dateend": "2011-02-21",
    "timestart": "12:00",
    "timeend": "14:00",
    "date_available": "10000"
  },
  {
    "date_id": "546580",
    "live": "y",
    "datestart": "2015-08-15",
    "dateend": "2015-08-15",
    "timestart": "12:00",
    "timeend": "14:00",
    "date_available": "10000"
  }
]
}
}

我有&#34;日期&#34;:

的poco
public class EventDate {

    [JsonProperty("date_id")]
    public string Id { get; set; }


    [JsonProperty("live")]
    [JsonConverter(typeof(AvailableForSalesFiledConverter))]
    public bool AvailableForSales { get; set; }


    [JsonProperty("datestart")]
    public string DateStart { get; set; }


    [JsonProperty("dateend")]
    public string DateEnd { get; set; }


    [JsonProperty("timestart")]
    public string TimeStart { get; set; }


    [JsonProperty("timeend")]
    public string TimeEnd { get; set; }


    [JsonProperty("date_available")]
    public int DateAvailable { get; set; }
}

因此,当我尝试反序列化时,我会遇到异常: &#34;无法反序列化当前的JSON对象(例如{\&#34; name \&#34;:\&#34; value \&#34;}) into type&#39; System.Collections.Generic.List`1 [TicketProvider.BrownPaperTickets.Entities.EventDate]&#39; 因为类型需要JSON数组(例如[1,2,3])才能正确反序列化。\ r \ nTo 修复此错误要么将JSON更改为JSON数组(例如[1,2,3]) 或更改反序列化类型,使其成为普通的.NET类型 (例如,不是像整数这样的基本类型,不是像数组或List那样的集合类型) 可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到 键入以强制它从JSON对象反序列化。\ r \ n路由&#39; date_id&#39;,第2行,第13位。&#34; 我怎样才能把它送到List?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我有点疑惑,因为你似乎正在那里做一些混杂的事情。

我建议您创建一个POCO对象,将您的数据表示为一个类。它应该有一个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? 

您的poco仅适用于活动日期 你需要另外一个带有变量的poco:

  

&#34;文档&#34;,&#34;结果&#34;,&#34;结果代码&#34;,&#34;注意&#34;,&#34; totaldates&#34;,&# 34;日期&#34;

它可能被称为documenttotaldates将是一个int,而date将是List<DateEvent>。 这就是你要序列化和反序列化的内容。

答案 2 :(得分:-2)

首先,在您的类中将RootObject中的类的实例转换为列表,例如:

class RootObject
{
public List<Class1> Property1 { get; set; }
}

现在,您可以按列表访问该类中的项目。