C# 无法将JSON序列化到字典
我在将JSON序列化到具有dictionary属性的类时遇到问题。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":
整个过程有点复杂,作为输入,我有一个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汉克:)但这是我试图避免的解决方案。