2016-11-10 2 views
1

Я пытаюсь десериализовать C# Dictionary<string,object>, который содержит Dictionary<string,bool> в качестве одной из записей. Код генерирует/сериализует файл в порядке, но когда он загружается, я получаю следующую ошибку.NewtonSoft.Json, Невозможно десериализовать дочерний словарь в словаре

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

пытался выяснить это в течение нескольких часов в настоящее время, и после того, как много я не прибегая к помощи может показаться, чтобы понять это. Исходные файлы немного большие, поэтому я свяжу их ниже, а не отправляю полные файлы.

Код 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, поэтому он будет десериализацией 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 
    } 
} 
+1

Это сделал трюк, спасибо. – XerShade

Смежные вопросы