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

时间:2021-03-04 14:31:23

标签: c# json deserialization

我正在尝试反序列化 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.Show”类型,因为 该类型需要一个 JSON 对象(例如 {"name":"value"})来反序列化 正确。要修复此错误,请将 JSON 更改为 JSON 对象 (例如 {"name":"value"})或将反序列化类型更改为数组或 实现集合接口的类型(例如 ICollection、 IList) 像可以从 JSON 数组反序列化的 List。 也可以将 JsonArrayAttribute 添加到类型中以强制它 从 JSON 数组反序列化。

我到底做错了什么?如果我让 Show 属性 dynamic 而不是 class Show 那么它就可以工作

更新:我确实在数据中发现有时有不止一个节目:

{ "@event_no":"54535", "@name":"已编辑", “显示”: [ { "@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" } ] }

1 个答案:

答案 0 :(得分:1)

问题是我正在从 XML 转换为 JSON 到 Object。我决定直接从 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);

现在我可以正常查看所有数据属性了。