Как получить 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; } } 
  • Задача не сериализуема: java.io.NotSerializableException при вызове функции закрытие только для classов не объектов
  • Использование JsonConvert.DeserializeObject для десериализации Json в class C # POCO
  • Как десериализовать JSON с двойными именами свойств в одном и том же объекте
  • StackOverflowError при сериализации объекта в Java
  • ТипNameHandling предостережение в Newtonsoft Json
  • JSON.Net Обнаружен собственный цикл привязки
  • Json Сериализация Java, которая работает с GWT
  • Исключить свойство из сериализации через пользовательский атрибут (json.net)
  • JSON.NET Parser * кажется * будет двойной сериализацией моих объектов
  • Невозможно десериализовать lambda
  • Использование JSON.NET для возврата ActionResult
  • Давайте будем гением компьютера.