将 JSON 转换为字典?
Posted
技术标签:
【中文标题】将 JSON 转换为字典?【英文标题】:Convert JSON to dictionary? 【发布时间】:2018-07-04 01:11:20 【问题描述】:我在将 JSON 转换为字符串字典时遇到了问题。这是我试图在 C# 中转换成字典的一些 JSON 文本。
"game":
"players":
"limit": "10000",
"ip_limit": "4"
加载配置时出错。 Newtonsoft.Json.JsonSerializationException:无法反序列化 当前 JSON 对象(例如 "name":"value")转换为类型 'System.Collections.Generic.List
1[System.Collections.Generic.KeyValuePair
2[System.String,System.String]]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。要修复此错误,请将 JSON 更改为 JSON 数组 (例如 [1,2,3])或更改反序列化类型,使其成为正常的 .NET 类型(例如,不是像整数这样的原始类型,也不是集合 可以从 JSON 反序列化的数组或列表等类型 目的。 JsonObjectAttribute 也可以添加到类型中来强制它 从 JSON 对象反序列化。路径“数据库”,第 2 行,位置 15. 在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, 对象现有值)在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, 对象现有值)在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader 阅读器,类型 objectType,布尔值 checkAdditionalContent)在 Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader 阅读器, 类型 objectType) 在 Newtonsoft.Json.JsonConvert.DeserializeObject(字符串值,类型类型, JsonSerializerSettings 设置)在 Newtonsoft.Json.JsonConvert.DeserializeObject[T](字符串值, JsonSerializerSettings 设置)在 Newtonsoft.Json.JsonConvert.DeserializeObject[T](字符串值)
_configItems = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(File.ReadAllText(fileName))
.ToDictionary(pair => pair.Key, pair => pair.Value);
_configItems 是一个Dictionary<string, string>
【问题讨论】:
你想在 _configItems 中有什么值? 【参考方案1】:您不能将具有分层属性的类反序列化为键值对列表。我假设您想从这些项目中获得一个键值对列表:
key=limit : value=10000
--------------------------
key=ip_limit : value=4
但如果是这样,您的序列化程序应该如何处理“游戏”和“玩家”属性?只是忽略它?它应该如何知道要忽略什么以及反序列化什么?
因此,您应该尝试将 json 内容带入代码结构,例如类。当然,您可以手动编写类,但在这里搜索“json to c# classes”可能是个好主意。只需形成类以匹配 json 字符串,这样您就可以将 json 值带入您的代码中。
你可能会得到这样的东西:
public class Game
public Players players get; set;
public class Players
public string limit get; set;
public string ip_limit get; set;
我敢打赌,您可以像这样反序列化您的数据:
var game = JsonConvert.DeserializeObject<Game>(File.ReadAllText(fileName));
完成后,您现在可以访问属性game.Players
及其子属性limit
和ip_limit
。
请注意,我建议在这里使用干净的属性名并将值映射到 json 属性。
现在你已经知道了 - 如果你真的仍然需要一个字典来存储这些值(你可能不需要,因为你现在可以很容易地访问这些值)你可以在你的 game
对象上使用方法 ToDictionary()
。
【讨论】:
【参考方案2】:如果你需要跳过根对象和第一层,你可以简单地使用这些:
var json = File.ReadAllText(fileName);
_configItems = JObject.Parse(json)["game"]["players"]
.Children<JProperty>()
.ToDictionary(x => x.Name, x => (string)x.Value);
但是,如果您可以调整现有代码以使其适合,请考虑使用@Waescher 反序列化为适当类的方法。但是将 string
类型更改为更合适的类型,例如:int
。
【讨论】:
确实很整洁。 :)【参考方案3】:只是要添加到@Waeschers 答案的另一个信息,如果您不确定如何获取课程,在 Visual Studio 中,您可以复制要反序列化的 json 并转到 Edit --> PasteSpecial --> Paste Json 作为类。它将创建与@Waeschers 提到的相同的类。
【讨论】:
以上是关于将 JSON 转换为字典?的主要内容,如果未能解决你的问题,请参考以下文章