2014-01-28 5 views
3

Я использую Json.NET для десериализации объекта, который включает вложенный словарь. Вот пример того, что я пытаюсь сделатьJson.net десериализованный вложенный словарь

public interface IInterface 
{ 
    String Name { get; set; } 
} 

public class AClass : IInterface 
{ 
    public string Name { get; set; } 
} 

public class Container 
{ 
    public Dictionary<IInterface, string> Map { get; set; } 
    public Container() 
    { 
     Map = new Dictionary<IInterface, string>(); 
    } 
} 


public static void Main(string[] args) 
    { 
     var container = new Container(); 
     container.Map.Add(new AClass() 
     { 
      Name = "Hello World" 
     }, "Hello Again"); 
     var settings = new JsonSerializerSettings 
     { 
      TypeNameHandling = TypeNameHandling.Objects, 
      PreserveReferencesHandling = PreserveReferencesHandling.All, 

     }; 


     string jsonString = JsonConvert.SerializeObject(container, Formatting.Indented, settings); 
     var newContainer = JsonConvert.DeserializeObject<Container>(jsonString); 
    } 

Я получил сообщение об исключении: не удалось преобразовать строку «ConsoleApplication1.AClass» в словарь ключей типа «ConsoleApplication1.IInterface». Создайте TypeConverter для преобразования из строки в объект типа ключа. Примите мои извинения, но я не могу найти способ де-сериализации интерфейса в словаре.

Большое спасибо заранее

ответ

4

Вопрос заключается в том, что JSON словари (объекты) поддерживают только строковые ключи, поэтому Json.Net преобразует сложный тип ключа в строку Json (вызов ToString()), который может» t затем снова десериализуется в сложный тип. Вместо этого вы можете сериализовать словарь как набор пар ключ-значение, применяя атрибут JsonArray.

Для получения более подробной информации см. this question.

+0

спасибо. Предыдущий вопрос предлагает JsonArrayAttribute, однако он доступен только для класса, но как свойство. В любом случае, чтобы отметить свойство с помощью атрибута коллекции или словаря, пожалуйста. – duongthaiha

+2

@duongthaiha вместо того, чтобы создавать свое свойство словарного типа, можете ли вы создать производный класс словаря с использованием объявления атрибута? – ChaseMedallion

+0

Применяя атрибут 'JsonArray', требуется подкласс' Dictionary '. Один из вариантов заключается в преобразовании словаря в «List >», вызывая 'ToList()' в словаре и вместо этого сериализуя список. Затем, при десериализации, преобразуйте его обратно в словарь, используя 'ToDictionary (x => x.Key, x => x.Value)'. –

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