我正在尝试将包含Dictionary<string,object>
的C#Dictionary<string,bool>
反序列化为其中一个条目。代码生成/序列化文件很好但是当它加载它时我得到以下错误。
Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'System.Collections.Generic.Dictionary`2[System.String,System.Boolean]
现在试图解决这个问题几个小时,经过大量谷歌搜索后,我似乎无法弄明白。源文件有点大,所以我会在下面链接它们而不是发布完整的文件。
此类中Get函数的返回调用错误代码, https://gitlab.com/XerShade/Esmiylara.Online/blob/alpha-2-dev/source/Esmiylara.Frameworks/ConfigurationFile.cs
以下是我用来测试ConfigurationFile类以供参考的调试配置类。 https://gitlab.com/XerShade/Esmiylara.Online/blob/alpha-2-dev/source.debug/Esmiylara.Debug/DebugConfig.cs
非常感谢任何帮助。
编辑:这是生成的JSON文件,以防任何人需要查看它。
{
"RandomStringValue": "Some profound text will appear here!",
"RandomBooleans": {
"Player 1": false,
"Player 2": false,
"Player 3": false,
"Player 4": false
}
}
答案 0 :(得分:2)
JSON.NET默认情况下无法从JSON字符串中确定对象类型,因此它会将object
类型反序列化为JToken。
但您可以使用TypeNameHandling设置更改默认行为。
例如:
var dict = new Dictionary<string, object>()
{
{ "RandomBooleans", new Dictionary<string, bool>() { {"Player 1", true}, {"Player 2", false} } }
};
var settings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All
};
var json = JsonConvert.SerializeObject(dict, settings);
var dictDeserialized = JsonConvert.DeserializeObject<Dictionary<string, object>>(json, settings);
请注意,您必须将设置传递给序列化和反序列化调用。
生成的json将如下所示:
{
"$type":"System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]], mscorlib",
"RandomBooleans":{
"$type":"System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Boolean, mscorlib]], mscorlib",
"Player 1":true,
"Player 2":false
}
}