反序列化JSON错误:该类型需要JSON对象



我正在尝试反序列化JSON响应,但是在创建数据模型时我做错了。

我用EventsData resultJSON = JsonConvert.DeserializeObject<EventsData>(jsonText);正常反序列化

JSON包含事件列表,如:

{
"@event_no":"6924",
"@name":"REDACTED",
"Show":{
"@show_no":"1",
"@show_datetime":"2007-04-05 15:00:00"
}
},
{
"@event_no":"6925",
"@name":"REDACTED",
"Show":{
"@show_no":"1",
"@show_datetime":"2007-04-15 15:00:00"
}
}

我的数据模型:

public class Show
{
[JsonProperty("@show_no")]
public string show_no { get; set; }
[JsonProperty("@show_datetime")]
public string show_datetime { get; set; }
}
public class Event
{
[JsonProperty("@event_no")]
public string event_no { get; set; }
[JsonProperty("@name")]
public string name { get; set; }
public Show Show { get; set; }
}
public class Events
{
public List<Event> Event { get; set; }
}
public class EventsData
{
public Events Events { get; set; }
}

然而,当我试图反序列化时,我得到以下错误:

Newtonsoft.Json。JsonSerializationException: '不能反序列化将当前JSON数组(例如[1,2,3])转换为类型"VM_Models"。秀",因为该类型需要一个JSON对象(例如{"name":"value"})来反序列化正确。要修复此错误,可以将JSON更改为JSON对象(例如{"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如:ICollection;List)之类的可以从JSON数组反序列化的列表。也可以将JsonArrayAttribute添加到类型中以强制它从JSON数组反序列化。

我到底做错了什么?如果我将显示属性设置为dynamic而不是Show那么它就可以工作了

更新:我确实在数据中发现有时有多个显示:

{"@event_no"54535","@name"REDACTED"Show"({"@show_no"1",@show_datetime"; "2009-05-06 19:00:00;},{"@show_no"2",@show_datetime"; "2009-05-07 19:00:00;},{"@show_no"3",@show_datetime"; "2009-05-08 19:00:00;},{"@show_no"4",@show_datetime";2009-05-09 19:00:00"},{"@show_no"5";@show_datetime"; "2009-05-10 19:00:00;}]}

问题是我正在从XML转换到JSON到对象。我决定从XML直接转换为对象:

[XmlRoot(ElementName = "Show", Namespace = "http://REDACTED/schema")]
public class Show
{
[XmlAttribute(AttributeName = "show_no")]
public string Show_no { get; set; }
[XmlAttribute(AttributeName = "show_datetime")]
public string Show_datetime { get; set; }
}

[XmlRoot(ElementName = "Event", Namespace = "http://REDACTED/schema")]
public class Event
{
[XmlElement(ElementName = "Show", Namespace = "http:/REDACTED/schema")]
public List<Show> Show { get; set; }
[XmlAttribute(AttributeName = "event_no")]
public string Event_no { get; set; }
[XmlAttribute(AttributeName = "name")]
public string Name { get; set; }
}

[XmlRoot(ElementName = "Events", Namespace = "http://REDACTED/schema")]
public class Events
{
[XmlElement(ElementName = "Event", Namespace = "http://REDACTED/schema")]
public List<Event> Event { get; set; }
[XmlAttribute(AttributeName = "xmlns")]
public string Xmlns { get; set; }
}

然后在代码中:

XmlSerializer serializer = new XmlSerializer(typeof(Events));
TextReader reader = new StringReader(response.Content);
Events result = (Events)serializer.Deserialize(reader);

现在我可以正常看到所有的数据属性。

最新更新