【问题标题】:Iterating a JSON object array name value pair in c#在 C# 中迭代​​ JSON 对象数组名称值对
【发布时间】:2017-11-27 15:21:23
【问题描述】:

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

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),例如可以从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组反序列化。 路径“-KeArK3V02mXYWx2OMWh”,第 2 行,位置 XX。

【问题讨论】:

    标签: c# arrays json dynamic undefined


    【解决方案1】:

    Json 的结构有问题。您的 json 具有像 Key 和 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());
    

    【讨论】:

    • 就在我的眼皮底下,我错过了。我想我被抛弃了,因为如果我用成员public Title X; public Title y; public Title z; 编写一个类(出于测试目的说TClass)并将其传递给JsonConvert.DeserializeObject&lt;TClass&gt;(jsonString) 它可以工作,我不必在类中定义一个数组。我想知道为什么会这样?
    • 奇怪的是,如果我使用List&lt;KeyValuePair&lt;string, Title[]&gt;&gt; 而不是Dictionary,它不起作用。知道为什么(JSON数组的相同错误)。我需要维持秩序。
    【解决方案2】:

    除非我遗漏了什么,否则您链接了一个题为“Iteration over a JSON object (NOT an array) in C#”的问题

    然而你的 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"
    }]
    

    【讨论】:

    • 知道为什么List&lt;KeyValuePair&lt;string, Title[]&gt;&gt; 不能代替Dictionary 工作吗?我需要保留广告订单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多