Как получить json.net для сериализации членов classа, полученных из List ?

Я создал class PagedResult : List который содержит несколько добавленных элементов для работы с одним из наших компонентов. Однако, когда я запускаю json deserializer, он только сериализует список. Если я разметка производного classа с помощью [JsonObject] и [JsonProperty] то он будет сериализовать только члены производного classа, а не списка. Как мне получить оба?

По умолчанию Json.Net будет обрабатывать любой class, который реализует IEnumerable как массив. Вы можете переопределить это поведение, украсив class атрибутом [JsonObject] , но тогда только свойства объекта будут сериализованы, как вы видели. Сам список не будет сериализован, потому что он не отображается через публичное свойство (скорее, он открывается через GetEnumerator() ).

Если вы хотите обоим, вы можете либо сделать, как предложили @Konrad, и предоставить публичное свойство для вашего производного classа, чтобы открыть список, или вы можете написать пользовательский JsonConverter для сериализации всего, что сочтет нужным. Далее следует пример последнего подхода.

Предполагая, что ваш PagedResult выглядит примерно так:

 class PagedResult : List { public int PageSize { get; set; } public int PageIndex { get; set; } public int TotalItems { get; set; } public int TotalPages { get; set; } } 

Вы можете сделать конвертер для него следующим образом:

 class PagedResultConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(PagedResult)); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { PagedResult result = (PagedResult)value; JObject jo = new JObject(); jo.Add("PageSize", result.PageSize); jo.Add("PageIndex", result.PageIndex); jo.Add("TotalItems", result.TotalItems); jo.Add("TotalPages", result.TotalPages); jo.Add("Items", JArray.FromObject(result.ToArray(), serializer)); jo.WriteTo(writer); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } } 

(Обратите внимание также, что [JsonObject] и [JsonProperty] не требуются при таком подходе, потому что знание того, что сериализовать, инкапсулируется в class преобразователя.)

Вот демонстрация, показывающая конвертер в действии:

 class Program { static void Main(string[] args) { PagedResult result = new PagedResult { "foo", "bar", "baz" }; result.PageIndex = 0; result.PageSize = 10; result.TotalItems = 3; result.TotalPages = 1; JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Converters.Add(new PagedResultConverter()); settings.Formatting = Formatting.Indented; string json = JsonConvert.SerializeObject(result, settings); Console.WriteLine(json); } } 

Вывод:

 { "PageSize": 10, "PageIndex": 0, "TotalItems": 3, "TotalPages": 1, "Items": [ "foo", "bar", "baz" ] } 

Самое простое решение, которое приходит мне на ум, состоит в том, чтобы выставлять внутренние элементы в качестве другого свойства производного classа:

 [JsonProperty] public IEnumerable Elements { get { return this; } } 
  • Невозможно сериализовать словарь с помощью сложного ключа с помощью Json.net
  • Когда и почему сущности JPA должны реализовывать интерфейс Serializable?
  • Как реализовать TypeAdapterFactory в Gson?
  • Почему java.util.Optional не является Serializable, как сериализовать объект с такими полями
  • Сериализация с Qt
  • Джерси + jackson JSON формат даты формат - как изменить формат или использовать пользовательские JacksonJsonProvider
  • Добавление к ObjectOutputStream
  • Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
  • Получение ServiceStack для сохранения информации о типе
  • Как десериализовать JSON с двойными именами свойств в одном и том же объекте
  • Сериализовать статический class?
  • Interesting Posts

    Как инвертировать Fn-ключ

    Есть ли хороший DNS-сервер, который я могу установить в Windows 7 для локальной сети?

    Javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL-квитирование отменено: ошибка в библиотеке SSL, обычно ошибка протокола

    Как я могу профилировать приложение для Android?

    Как прочитать файл внешних свойств в Maven

    «Diff» изображение с помощью ImageMagick

    «Взаимодействие с пользователем не разрешено», пытаясь подписать приложение OSX с использованием кода

    Когда клиент Apache Kafka выдает исключение «Batch Expired»?

    Выбор рулетки в генетических алгоритмах

    VBA – ошибка времени выполнения 1004 «Определенная заявка или ошибка с определением объекта»

    В чем разница между сервером приложений и веб-сервером?

    Как связать две координаты с линией, используя Листовку в R

    LoaderCallbacks.onLoadFinished не вызывается, если изменение ориентации происходит во время запуска AsyncTaskLoader

    Маршруты Rails на основе условия

    Исключение в streamе «main» java.util.NoSuchElementException: строка не найдена – использование ввода сканера

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