2016-11-10 15 views
1

Dictionary<string,bool>をエントリの1つとして含むC#Dictionary<string,object>を逆シリアル化しようとしています。コードは、ファイルを生成/シリアライズしますが、ロードすると次のエラーが発生します。NewtonSoft.Json、辞書の子辞書を逆シリアル化できません

Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'System.Collections.Generic.Dictionary`2[System.String,System.Boolean] 

は今、数時間のためにこれを理解しようとしてきて、ずっとグーグルの後、私はそれを把握するように見えることはできません。ソースファイルは少し大きいので、私は完全なファイルをポストするのではなく、それらをリンクします。

コードは、このクラスのGet関数の戻り値の呼び出しでerroringされ、 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

を使用すると、JSONデータを投稿することができ – Ramakrishnan

+0

JSONファイルデータがあり、またはあなたは私のコードを実行し、完全なエラーの詳細を取得したいですか? – XerShade

答えて

2

JSON.NETは、JSON文字列からオブジェクトタイプを決定することはできませんので、JTokenとしてobjectタイプをデシリアライズします。

ただし、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 
    } 
} 
+1

それはトリックでした、ありがとう。 – XerShade