将 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.List1[System.Collections.Generic.KeyValuePair2[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&lt;string, string&gt;

【问题讨论】:

你想在 _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 及其子属性limitip_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 转换为字典?的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 数据转换为字典

Python:将字典列表转换为 json

如何将返回的python JSON字典转换为字典中的列表,并将数据转换为SQL插入

将字典数组转换为 JSON 格式

将 JSON 转换为 Python 字典

通过将键作为列将 json 字典转换为 spark 数据帧