首页 文章

将JSON转换为字典?

提问于
浏览
0

我遇到了将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 回答

  • 0

    您不能将具有分层属性的类反序列化为keyvaluepairs列表 . 我假设您想要从这些项目中获得keyvaluepairs列表:

    key=limit    : value=10000
    --------------------------
    key=ip_limit : value=4
    

    但如果是这样,你的序列化器应该对属性“游戏”和“玩家”做些什么呢?只是忽略它?它应该如何知道要忽略什么以及要反序列化的内容?

    因此,您应该尝试将json内容添加到代码结构中,例如类 . 当然你可以手动编写类,但谷歌搜索“json到c#类”可能是一个好主意 . 只需形成类以匹配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() .

  • 1

    如果您需要跳过根对象和第一层,您可以简单地使用这些:

    var json = File.ReadAllText(fileName);
    _configItems = JObject.Parse(json)["game"]["players"]
        .Children<JProperty>()
        .ToDictionary(x => x.Name, x => (string)x.Value);
    

    但是,如果您可以调整现有代码以使其适合,请考虑使用@ Waescher的反序列化方法进行正确的类 . 但是将 string 类型更改为更合适的类型,例如: int .

  • 4

    只是要添加到@Waeschers答案的另一个信息,如果你不确定如何获取类,在visual studio中,你可以复制你想要反序列化的json并转到Edit - > PasteSpecial - > Paste Json as Classes . 它将创建与@Waeschers提到的相同的类 .

相关问题