C# 无法将JSON序列化到字典

C# 无法将JSON序列化到字典,c#,json,dictionary,json.net,yamldotnet,C#,Json,Dictionary,Json.net,Yamldotnet,我在将JSON序列化到具有dictionary属性的类时遇到问题。 整个过程有点复杂,作为输入,我有一个YAML文件,我使用YamlDotNet和NewtonSoft 这是Yaml和JSON输出的一个示例 some_element: '1' should_be_dic_element: - a: '1' - b: '2' { "some_element": "1", "should_be_dic_element": [ { "a": "1" }, { "b":

我在将JSON序列化到具有dictionary属性的类时遇到问题。
整个过程有点复杂,作为输入,我有一个YAML文件,我使用
YamlDotNet
NewtonSoft

这是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; }
 }
公共类SomeClass
{
[JsonProperty(PropertyName=“some_元素”)]
公共字符串SomeProperty{get;set;}
[JsonProperty(PropertyName=“应该是dic元素”)]
公共字典{get;set;}
}
我知道数组字典的问题,所以这些都是我尝试过的

通过使用字典,我得到以下信息

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

像这样使用字典中的新类

[JsonArray]
class X : Dictionary<string, string> { }
[JsonArray]
类别X:字典{}
错误值不能为空。 参数名称:key

使用
KeyValuePair[]
/
List
结果是元素数量,但值为空


有什么建议吗?

我认为您尝试反序列化的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; }
 }
公共类SomeClass
{
[JsonProperty(PropertyName=“some_元素”)]
公共字符串SomeProperty{get;set;}
[JsonProperty(PropertyName=“应该是dic元素”)]
公共列表字典{get;set;}
}

你是对的,这不是理想的字典json表示法,但这是可能的。许多文章都在讨论这一点。这就是我在派生类上使用JsonArrayAttribute的原因。请参阅更新的答案,你应该能够以这种方式反序列化,但处理数据的代码可能会因此变得有点笨拙。T汉克:)但这是我试图避免的解决方案。