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

时间:2017-06-24 00:47:59

标签: c# arrays json dynamic undefined

我从这里的类似问题中采用了这个例子:

Iterating over a JSON object (NOT an array) in C#

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

正如所指出的,我可以有一个未定义的条目数,我想遍历这些条目并根据定义的类将数据结构提取到一个数组/对象列表中。

{
  "-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])反序列化为类型“Title”,因为该类型需要JSON对象(例如{“name”:“value”})才能正确反序列化。   要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如List从JSON数组反序列化。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。   路径'-KeArK3V02mXYWx2OMWh',第2行,XX位置。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

  

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

因此,您只需将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"
}]