Невозможно сериализовать словарь с помощью сложного ключа с помощью Json.net

У меня есть словарь с пользовательским .net Тип как его ключ. Я пытаюсь сериализовать этот словарь в JSON с помощью JSON.net, но его невозможно преобразовать в правильное значение во время сериализации.

class ListBaseClass { public String testA; public String testB; } ----- var details = new Dictionary(); details.Add(new ListBaseClass { testA = "Hello", testB = "World" }, "Normal"); var results = Newtonsoft.Json.JsonConvert.SerializeObject(details); var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary> results); 

Это дайте мне -> “{\” JSonSerialization.ListBaseClass \ “: \” Normal \ “}”

Однако, если у меня есть свой пользовательский тип как значение в словаре он хорошо работает

  var details = new Dictionary(); details.Add("Normal", new ListBaseClass { testA = "Hello", testB = "World" }); var results = Newtonsoft.Json.JsonConvert.SerializeObject(details); var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary>(results); 

Это дайте мне -> “{\” Normal \ “: {\” testA \ “: \” Hello \ “, \” testB \ “: \” World \ “}}”

Может ли кто-нибудь предложить, если я нахожу какое-то ограничение Json.net, или я делаю что-то не так?

В разделе « Руководство по сериализации» (см. Раздел: Словари и Hashtables, спасибо @Shashwat за ссылку):

При сериализации словаря ключи словаря преобразуются в строки и используются в качестве имен свойств объекта JSON. Строку, написанную для ключа, можно настроить либо путем переопределения ToString () для типа ключа, либо путем реализации TypeConverter. TypeConverter также будет поддерживать преобразование пользовательской строки обратно при десериализации словаря.

Я нашел полезный пример того, как реализовать такой конвертер типов на странице «how-to» Microsoft:

  • Внедрение конвертера типов (см. Раздел Преобразователи типов для преобразования значений).

По сути, мне нужно было расширить System.ComponentModel.TypeConverter и переопределить:

 bool CanConvertFrom(ITypeDescriptorContext context, Type source); object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value); object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType); 

Также необходимо добавить атрибут [TypeConverter(typeof(MyClassConverter))] в объявление classа MyClass .

С их помощью я смог автоматически сериализовать и десериализовать словари.

Все проще

 var details = new Dictionary(); details.Add("Normal", new ListBaseClass { testA = "Hello", testB = "World" }); var results = Newtonsoft.Json.JsonConvert.SerializeObject(details.ToList()); var data = Newtonsoft.Json.JsonConvert.DeserializeObject> results); 

Образец

  class Program { static void Main(string[] args) { var testDictionary = new Dictionary() { { new TestKey() { TestKey1 = "1", TestKey2 = "2", TestKey5 = 5 }, new TestValue() { TestValue1 = "Value", TestValue5 = 96 } } }; var json = JsonConvert.SerializeObject(testDictionary); Console.WriteLine("=== Dictionary =="); Console.WriteLine(json); // result: {"ConsoleApp2.TestKey":{"TestValue1":"Value","TestValue5":96}} json = JsonConvert.SerializeObject(testDictionary.ToList()); Console.WriteLine("=== List> =="); Console.WriteLine(json); // result: [{"Key":{"TestKey1":"1","TestKey2":"2","TestKey5":5},"Value":{"TestValue1":"Value","TestValue5":96}}] Console.ReadLine(); } } class TestKey { public string TestKey1 { get; set; } public string TestKey2 { get; set; } public int TestKey5 { get; set; } } class TestValue { public string TestValue1 { get; set; } public int TestValue5 { get; set; } } 
  • Преобразование байтов в Int / uint в C
  • Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
  • Сериализация нулевого значения в JSON.NET
  • Исключить свойство из сериализации через пользовательский атрибут (json.net)
  • Использование JSON.NET для возврата ActionResult
  • Использование преобразователей Json.NET для десериализации свойств
  • Удаление десериализации JSON в объект с помощью Json.NET
  • jackson - Как обрабатывать (десериализовать) вложенный JSON?
  • Сериализация типа Json.Net с полиморфным дочерним объектом
  • Получение ServiceStack для сохранения информации о типе
  • gwt - Использование списка в вызове RPC?
  • Interesting Posts

    Обнаруживать, если он работает как администратор с повышенными привилегиями или без них?

    Удаление пароля из документа Excel

    Samsung Series 5 BIOS не обнаруживает никаких загрузочных устройств

    Где пропал сценарий JavaFX?

    Какова цель этого 4-контактного кабеля с 3 проводами, которые поставляются со старым DVD-приводом IDE?

    В каком режиме современные 64-разрядные чип-чипы Intel запускают загрузочный сектор?

    BIND9 не может разрешить локальный домен

    Можно ли суммировать весь столбец без установки явных границ ячеек в Excel?

    Будет ли веб-браузер кэшировать содержимое по https

    Есть ли способ включить более 4 ГБ оперативной памяти в 32-разрядную ОС Windows?

    Передача изображения OpenCV на C ++ через сокет

    В Windows 10 почему некоторые программы не масштабируются на втором мониторе?

    C ++ неявный конструктор копирования для classа, который содержит другие объекты

    Как установить длинный путь Java classpath в Windows?

    Добавить статический вход ARP в маршрутизатор Verizon AC1750

    Давайте будем гением компьютера.