Подтвердить что ты не робот

JSON.net ContractResolver против JsonConverter

Я работаю с JSON.net некоторое время. Я написал как пользовательские конвертеры, так и пользовательские разрешители контрактов (как правило, из модификаций примеров на S.O. и на сайте Newtonsoft), и они работают нормально.

Задача, кроме примеров, я не вижу объяснений относительно того, когда я должен использовать один или другой (или оба) для обработки. По собственному опыту я в основном определил, что контрактные преобразователи проще, поэтому, если я могу делать то, что мне нужно, я иду таким образом; в противном случае я использую пользовательские JsonConverters. Но я также знаю, что оба они иногда используются вместе, поэтому концепции становятся более непрозрачными.

Вопросы:

  • Есть ли источник, который отличает, когда пользователь один против другого? Я нахожу, что документация Newtonsoft неясно, как эти два дифференцируются или когда использовать один или другой.
  • Что такое конвейер между двумя?
4b9b3361

Ответ 1

Отличный вопрос. Я не видел четкую документацию, в которой говорится, что если вы предпочитаете писать пользовательский ContractResolver или пользовательский JsonConverter для решения определенного типа проблем. Они действительно делают разные вещи, но есть некоторые совпадения между тем, какие проблемы могут быть решены каждым. Я написал много слов, отвечая на вопросы StackOverflow, поэтому картина со временем стала мне более понятной. Ниже я принимаю это.

ContractResolver

Контракторный преобразователь всегда используется Json.Net и регулирует поведение сериализации/десериализации на широком уровне. Если в настройках нет настраиваемого преобразователя, используется DefaultContractResolver. Ответчик отвечает за определение:

  • какой контракт имеет каждый тип (т.е. он примитив, массив/список, словарь, динамический, JObject, простой старый объект, и т.д.);
  • какие свойства относятся к типу (если есть), и каковы их имена, типы и доступность;
  • что attributes были применены (например, [JsonProperty], [JsonIgnore], [JsonConverter] и т.д.) и
  • как эти атрибуты должны влиять на сериализацию (де) каждого свойства (или класса).

Вообще говоря, если вы хотите настроить некоторые аспекты сериализации или десериализации в широком диапазоне классов, вам, вероятно, потребуется использовать ContractResolver для этого. Вот несколько примеров вещей, которые вы можете настроить с помощью ContractResolver:

JsonConverter

В отличие от ContractResolver фокус a JsonConverter более узкий: он действительно предназначен для обработки сериализации или десериализации для одного типа или небольшого подмножества связанных типов. Кроме того, он работает на более низком уровне, чем распознаватель. Когда конвертер получает ответственность за тип, он полностью контролирует, как JSON считывается или записывается для этого типа: он напрямую использует JsonReader и JsonWriter, чтобы выполнить свою работу. Другими словами, он может изменить форму JSON для этого типа. В то же время конвертер отделен от "большой картинки" и не имеет доступа к контекстной информации, такой как родительский объект сериализуемого объекта или атрибуты свойств, которые были с ним использованы. Вот несколько примеров проблем, которые вы можете решить с помощью JsonConverter: