我遇到了将JSON转换为字符串字典的问题。这里有一些JSON文本,我正试图将其转化为C#中的一个字典。
{
"game": {
"players": {
"limit": "10000",
"ip_limit": "4"
}
}
}加载配置时出错。'System.Collections.Generic.List
1[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设置)
_configItems = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(File.ReadAllText(fileName))
.ToDictionary(pair => pair.Key, pair => pair.Value);_configItems是Dictionary<string, string>
发布于 2018-01-24 21:33:43
不能将具有层次属性的类反序列化为keyvaluepairs列表。我想您应该想从这些项目中获得一个键值的列表:
key=limit : value=10000
--------------------------
key=ip_limit : value=4但如果是这样,您的序列化程序应该如何处理属性“游戏”和“玩家”?就无视它?它应该如何知道该忽略什么和反序列化什么?
因此,您应该尝试将json内容带到代码结构中,比如类。当然,您可以手动编写类,但是在这里搜索“jsontoc#类”可能是个好主意。只需形成类来匹配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属性映射值。
现在您已经知道了--如果您仍然需要这些值的字典(您可能不需要这样做,因为您现在可以轻松地访问这些值),那么您可以在您的ToDictionary()对象上使用game方法。
发布于 2018-01-24 21:37:55
如果您需要跳过根对象和第一层,只需使用以下内容:
var json = File.ReadAllText(fileName);
_configItems = JObject.Parse(json)["game"]["players"]
.Children<JProperty>()
.ToDictionary(x => x.Name, x => (string)x.Value);但是,如果可以调整现有代码以使其适合,请考虑使用@Waescher的反序列化方法将其反序列化为适当的类。但是将string类型更改为更合适的类型,比如:int。
发布于 2018-01-25 07:58:23
在visual中,如果您不确定如何获得类,则可以复制要反序列化的json,然后转到Edit --> PasteSpecial ->将Json粘贴为类。它将创建与@W重工提到的类相同的类。
https://stackoverflow.com/questions/48431818
复制相似问题