首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >把JSON转换成字典?

把JSON转换成字典?
EN

Stack Overflow用户
提问于 2018-01-24 21:23:22
回答 3查看 931关注 0票数 0

我遇到了将JSON转换为字符串字典的问题。这里有一些JSON文本,我正试图将其转化为C#中的一个字典。

代码语言:javascript
复制
{
    "game": {
        "players": {
            "limit": "10000",
            "ip_limit": "4"
        }
    }
}

加载配置时出错。'System.Collections.Generic.List1[System.Collections.Generic.KeyValuePair2System.String,:无法将当前JSON对象(例如,{“名称”:“值”})反序列化为类型Newtonsoft.Json.JsonSerializationException System.String]‘,因为该类型需要一个JSON数组(例如,1、2、3)才能正确反序列化。要修复此错误,要么将JSON更改为JSON数组(例如,1,2,3),要么更改反序列化类型,使之成为可以从JSON对象反序列化的普通.NET类型(例如,不像整数这样的原始类型,而不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化。路径‘数据库’,第2行,第15位。在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader阅读器,objectType类型,JsonContract契约,JsonProperty成员,JsonContainerContract containerContract,JsonProperty containerMember,Object existingValue)的Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader阅读器,objectType,JsonContract契约,JsonProperty成员,JsonContainerContract containerContract,JsonProperty,Object existingValue)在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader阅读器,#en3 20#,布尔)在#EN3#阅读器,(在Newtonsoft.Json.JsonConvert.DeserializeObject(String值处键入objectType),在Newtonsoft.Json.JsonConvert.DeserializeObjectT的Newtonsoft.Json.JsonConvert.DeserializeObjectT上键入objectType(类型、JsonSerializerSettings设置)

代码语言:javascript
复制
_configItems = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(File.ReadAllText(fileName))
.ToDictionary(pair => pair.Key, pair => pair.Value);

_configItems是Dictionary<string, string>

EN

回答 3

Stack Overflow用户

发布于 2018-01-24 21:33:43

不能将具有层次属性的类反序列化为keyvaluepairs列表。我想您应该想从这些项目中获得一个键值的列表:

代码语言:javascript
复制
key=limit    : value=10000
--------------------------
key=ip_limit : value=4

但如果是这样,您的序列化程序应该如何处理属性“游戏”和“玩家”?就无视它?它应该如何知道该忽略什么和反序列化什么?

因此,您应该尝试将json内容带到代码结构中,比如类。当然,您可以手动编写类,但是在这里搜索“jsontoc#类”可能是个好主意。只需形成类来匹配json字符串,这样就可以将json值带入代码中。

你可能会得到这样的东西:

代码语言:javascript
复制
public class Game
{
    public Players players { get; set; }
}

public class Players
{
    public string limit { get; set; }
    public string ip_limit { get; set; }
}

我敢打赌,您可以像这样反序列化数据:

代码语言:javascript
复制
var game = JsonConvert.DeserializeObject<Game>(File.ReadAllText(fileName));

一旦有了它,现在就可以访问属性game.Players及其子属性limitip_limit

请注意,我建议在这里使用干净的属性名,并使用json属性映射值。

现在您已经知道了--如果您仍然需要这些值的字典(您可能不需要这样做,因为您现在可以轻松地访问这些值),那么您可以在您的ToDictionary()对象上使用game方法。

票数 4
EN

Stack Overflow用户

发布于 2018-01-24 21:37:55

如果您需要跳过根对象和第一层,只需使用以下内容:

代码语言:javascript
复制
var json = File.ReadAllText(fileName);
_configItems = JObject.Parse(json)["game"]["players"]
    .Children<JProperty>()
    .ToDictionary(x => x.Name, x => (string)x.Value);

但是,如果可以调整现有代码以使其适合,请考虑使用@Waescher的反序列化方法将其反序列化为适当的类。但是将string类型更改为更合适的类型,比如:int

票数 1
EN

Stack Overflow用户

发布于 2018-01-25 07:58:23

在visual中,如果您不确定如何获得类,则可以复制要反序列化的json,然后转到Edit --> PasteSpecial ->将Json粘贴为类。它将创建与@W重工提到的类相同的类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48431818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档