как десериализовать JSON в IEnumerable с помощью Newtonsoft JSON.NET

учитывая этот JSON:

[ { "$id": "1", "$type": "MyAssembly.ClassA, MyAssembly", "Email": "[email protected]com", }, { "$id": "2", "$type": "MyAssembly.ClassB, MyAssembly", "Email": "[email protected]", } ] 

и эти classы:

 public abstract class BaseClass { public string Email; } public class ClassA : BaseClass { } public class ClassB : BaseClass { } 

Как я могу десериализовать JSON в:

 IEnumerable deserialized; 

Я не могу использовать JsonConvert.Deserialize<IEnumerable>() потому что он жалуется, что BaseClass является абстрактным.

тебе нужно:

  JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; string strJson = JsonConvert.SerializeObject(instance, settings); 

поэтому JSON выглядит так:

 { "$type": "System.Collections.Generic.List`1[[MyAssembly.BaseClass, MyAssembly]], mscorlib", "$values": [ { "$id": "1", "$type": "MyAssembly.ClassA, MyAssembly", "Email": "[email protected]", }, { "$id": "2", "$type": "MyAssembly.ClassB, MyAssembly", "Email": "[email protected]", } ] } 

то вы можете десериализовать его:

 BaseClass obj = JsonConvert.DeserializeObject(strJson, settings) 

Документация: настройка TypeNameHandling

Вот способ сделать это, не заселяя $ type в json.

Конвертер Json:

 public class FooConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(BaseFoo)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); if (jo["FooBarBuzz"].Value() == "A") return jo.ToObject(serializer); if (jo["FooBarBuzz"].Value() == "B") return jo.ToObject(serializer); return null; } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } 

используй это:

 var test = JsonConvert.DeserializeObject>(result, new JsonSerializerSettings() { Converters = { new FooConverter() } }); 

взятый отсюда

используйте следующую конструкцию JsonSerializerSettings при десериализации:

 new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Objects }) 

Вы также можете обернуть перечислимое в class:

 class Wrapper { IEnumerable classes; } 

затем сериализуйте и десериализуйте это.

  • Разбор JSON с использованием Json.net
  • Серийный объект Json.NET с корневым именем
  • Использование JSON.NET для возврата ActionResult
  • Сериализация / десериализация пользовательской коллекции с дополнительными свойствами с помощью Json.Net
  • Как показать «вставить class Json» в visual studio 2012, нажав на «Специальная вставка»?
  • Как программно выбирать конструктор во время десериализации?
  • Как я могу зашифровать выбранные свойства при сериализации моих объектов?
  • Хранить корпус при сериализации словарей
  • Json.NET Отключить десериализацию в DateTime
  • JSON.Net выдает StackOverflowException при использовании
  • JSON.Net Обнаружен собственный цикл привязки
  • Interesting Posts

    Различия между .NET 4.0 и .NET 4.5 на высоком уровне в .NET.

    C # – создание всех производных classов вызывает конструктор базового classа

    Angular / RxJs Когда я должен отказаться от подписки на `Subscription`

    Могу ли я использовать подстановочные знаки в поиске Windows 8?

    mySQL – создание новой таблицы с использованием данных и столбцов из трех таблиц

    Проблема Java HttpClient для Java Java UTF-8

    Попытка создания URL-адресов REST-ful с несколькими точками в части «filename» – Spring 3.0 MVC

    Является ли CSS Turing полным?

    RuntimeException: невозможно создать экземпляр приложения

    Обязательный атрибут HTML5

    Рекомендации по подходам к шифрованию диска в Ubuntu?

    Обновление компьютера – эффективное клонирование 60 одинаковых компьютеров

    Как я могу заставить Windows 7 переключать звук с монитора (со встроенными динамиками) на наушники, когда они подключены?

    Как получить «положение: исправлено» css для работы в IE 7+ с TRANSITIONAL doctype?

    Что такое ошибка «Неверная инструкция: 4» и почему «-mmacosx-version-min = 10.x» исправить?

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