繁体   English   中英

在C#中迭代JSON对象数组名称值对

[英]Iterating a JSON object array name value pair in c#

我从一个类似的问题这里举了这个例子:

在C#中遍历JSON对象(不是数组)

但是我的数据格式有点不同,它有数组括号。

如前所述,我可以有数量不确定的条目,我想遍历条目并根据定义的类将数据结构提取到对象的数组/列表中。

{
  "-KeArK3V02mXYWx2OMWh" : [{
    "Description" : "this is a description",
    "Location" : "Atlanta",
    "Name" : "Event One",
    "Time" : "2017-03-01T21:53:12.924645Z"
  }],
  "-KeAtCNF_rmewZ_U3PpH" : [{
    "Description" : "another description",
    "Location" : "Charlotte",
    "Name" : "Event Two",
    "Time" : "2017-03-01T22:01:25.603547Z"
  }],
  "-KeAtd8CQW_EfH3Sw4YQ" : [{
    "Description" : "description goes here",
    "Location" : "Toronto",
    "Name" : "Event Three",
    "Time" : "2017-03-01T22:03:19.3953859Z"
  }]
}

我有一个称为Event的类,其定义如下

class Title {
  public string Description { get; set; }
  public string Location { get; set; }
  public string Name { get; set; }
  public DateTime Time { get; set; }
}

那里给出的答案(我认为是正确的)不起作用

Dictionary<string, Title> elist = JsonConvert.DeserializeObject<Dictionary<string, Title>>(jsonString);

它给我一个错误:

无法将当前JSON数组(例如[1,2,3])反序列化为类型“标题”,因为该类型需要JSON对象(例如{“ name”:“ value”})才能正确反序列化。 要解决此错误,可以将JSON更改为JSON对象(例如{“ name”:“ value”}),也可以将反序列化类型更改为数组,或者将实现集合接口的类型(例如ICollection,IList)更改为List,例如List从JSON数组反序列化。 还可以将JsonArrayAttribute添加到类型中,以强制其从JSON数组反序列化。 路径'-KeArK3V02mXYWx2OMWh',第2行,位置XX。

Json的结构存在问题。 您的json具有像Key和value这样的格式,但是value是按照json格式的数组。 您必须做以下事情。

Dictionary<string,Title[]> elist = JsonConvert.DeserializeObject<Dictionary<string, Title[]>>(jsonString);

以上解决方案是最简单的一种。

第二个解决方案。 (您必须根据需要进行修改,但当前的json可以使用)

 public class TitleConverter : JsonConverter
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JArray jObject = JArray.Load(reader);

            Title title = JsonConvert.DeserializeObject<Title>(jObject[0].ToString());
                return title;
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override bool CanConvert(Type objectType)
        {
            if (objectType.Name == "Title")
                return true;
            return false;
        }
    }

现在使用像这样。

Dictionary<string,Title> elist = JsonConvert.DeserializeObject<Dictionary<string, Title>>(jsonString,new TitleConverter());

除非我丢失了某些内容,否则您链接了一个标题为“在C#中遍历JSON对象(不是数组)”的问题。

但是,您的JSON显然包含一个数组,您甚至注意到自己:

“但是我的数据格式有点不同,它有数组括号。”

因此,您只需要将Title更改为Title数组( Title[] ):

Dictionary<string, Title[]> elist = JsonConvert.DeserializeObject<Dictionary<string, Title[]>>(jsonString);

如果您查看json,则可以清楚地看到其定义为对象数组(请查看'['和']'):

"-KeAtd8CQW_EfH3Sw4YQ" : [{
    "Description" : "description goes here",
    "Location" : "Toronto",
    "Name" : "Event Three",
    "Time" : "2017-03-01T22:03:19.3953859Z"
}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM