NewtonSoft.无法反序列化字典中的子字典

本文关键字:字典 反序列化 NewtonSoft | 更新日期: 2023-09-27 18:17:08

我正在尝试反序列化包含Dictionary<string,bool>作为条目之一的c# Dictionary<string,object>。代码生成/序列化文件很好,但当它去加载它时,我得到以下错误:

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
  }
}

NewtonSoft.无法反序列化字典中的子字典

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
   }
}