我遇到了将JSON转换为字符串字典的问题 . 这里有一些我想在C#中变成字典的JSON文本 .
{
"game": {
"players": {
"limit": "10000",
"ip_limit": "4"
}
}
}
加载配置时出错 . Newtonsoft.Json.JsonSerializationException:无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.List1 [System.Collections.Generic.KeyValuePair2 [System.String,System.String] ]]'因为类型需要JSON数组(例如[1,2,3])才能正确反序列化 . 要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List . JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化 . 在Newtonsoft.Json.Serialization的路径'数据库',第2行,位置15.在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader,Type objectType,JsonContract contract,JsonProperty成员,JsonContainerContract containerContract,JsonProperty containerMember,Object existingValue) . 在Newtonsoft.Json的Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader,Type objectType,Boolean checkAdditionalContent)中的JsonSerializerInternalReader.CreateValueInternal(JsonReader reader,Type objectType,JsonContract contract,JsonProperty成员,JsonContainerContract containerContract,JsonProperty containerMember,Object existingValue) . Newtonoft.Json中的Newtonoft.Json.JsonConvert.DeserializeObject(字符串值,类型类型,JsonSerializerSettings设置)中的JsonSerializer.DeserializeInternal(JsonReader reader,Type objectType)位于Newtonsoft.Json的Newtonsoft.Json.JsonConvert.DeserializeObject [T](字符串值,JsonSerializerSettings设置) .JS onConvert.DeserializeObject [T](String value)
_configItems = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(File.ReadAllText(fileName))
.ToDictionary(pair => pair.Key, pair => pair.Value);
_configItems是 Dictionary<string, string>
3 回答
您不能将具有分层属性的类反序列化为keyvaluepairs列表 . 我假设您想要从这些项目中获得keyvaluepairs列表:
但如果是这样,你的序列化器应该对属性“游戏”和“玩家”做些什么呢?只是忽略它?它应该如何知道要忽略什么以及要反序列化的内容?
因此,您应该尝试将json内容添加到代码结构中,例如类 . 当然你可以手动编写类,但谷歌搜索“json到c#类”可能是一个好主意 . 只需形成类以匹配json字符串,以便将json值引入代码中 .
你可能得到这样的东西:
我打赌你可以像这样反序列化你的数据:
完成后,您现在可以访问属性
game.Players
及其子属性limit
和ip_limit
.请注意,我建议在此处使用干净的属性名称,并使用json属性映射值 .
现在你已经得到了 - 如果你真的需要一个字典来存储这些值(你可能不需要因为你现在可以轻松访问这些值),你可以在
game
对象上使用方法ToDictionary()
.如果您需要跳过根对象和第一层,您可以简单地使用这些:
但是,如果您可以调整现有代码以使其适合,请考虑使用@ Waescher的反序列化方法进行正确的类 . 但是将
string
类型更改为更合适的类型,例如:int
.只是要添加到@Waeschers答案的另一个信息,如果你不确定如何获取类,在visual studio中,你可以复制你想要反序列化的json并转到Edit - > PasteSpecial - > Paste Json as Classes . 它将创建与@Waeschers提到的相同的类 .