【问题标题】:Unable to Serialize JSON to Dictionary无法将 JSON 序列化为字典
【发布时间】:2018-09-21 19:28:15
【问题描述】:

我在将 JSON 序列化为具有字典属性的类时遇到问题。
整个过程有点复杂,作为输入,我有一个 YAML 文件,我使用 YamlDotNet 和 NewtonSoft like so 将其转换为 json

这是 Yaml 和 JSON 输出的示例

some_element: '1'
should_be_dic_element:
 - a: '1'
 - b: '2'

{
 "some_element": "1",
 "should_be_dic_element": [
  {
   "a": "1"
  },
  {
   "b": "2"
  }
 ]
}

还有班级

 public class SomeClass
 {
    [JsonProperty(PropertyName = "some_element")]
    public string SomeProperty { get; set; }

    [JsonProperty(PropertyName = "should_be_dic_element")]
    public Dictionary<string, string> Dictionary { get; set; }
 }

我知道数组字典的问题,所以这就是我尝试过的所有方法。

使用字典我得到以下内容

错误无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“System.Collections.Generic.Dictionary`2[System.String,System.String]”,因为该类型需要 JSON 对象(例如 {"name":"value"}) 以正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组中反序列化

像这样使用字典中的新类

[JsonArray]
class X : Dictionary<string, string> { }

错误值不能为空。 参数名称:key

使用KeyValuePair&lt;string, string&gt;[] / List&lt;KeyValuePair&lt;string, string&gt;&gt; 结果是元素的数量,但具有空值。

有什么建议吗?

【问题讨论】:

    标签: c# json dictionary json.net yamldotnet


    【解决方案1】:

    我认为您尝试反序列化的 JSON 不符合您的类定义。尝试更改生成 JSON 的方式。

    对于字典类型的结构,我希望看到花括号 { 而不是 [ 来开始结构,例如:

    {
     "some_element": "1",
     "should_be_dic_element": {
      {
       "a": "1"
      },
      {
       "b": "2"
      }
     }
    }
    

    如果您想反序列化现有的 JSON 不变,请尝试使用您的类定义来指定字典列表:

     public class SomeClass
     {
        [JsonProperty(PropertyName = "some_element")]
        public string SomeProperty { get; set; }
    
        [JsonProperty(PropertyName = "should_be_dic_element")]
        public List<Dictionary<string, string>> Dictionary { get; set; }
     }
    

    【讨论】:

    • 你是对的,这不是理想的字典 json 表示,但可以做到。许多文章都在谈论它,这就是我在派生类上使用 JsonArrayAttribute 的原因。 stackoverflow.com/questions/43676125/…
    • 请查看更新后的答案,您应该能够以这种方式反序列化,但您处理数据的代码可能会因此变得更加笨拙。
    • 谢谢 :) 但这是我试图避免的解决方案。
    猜你喜欢
    • 2019-02-08
    • 2017-05-26
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多