Резюме
Можно ли использовать Newtonsoft.Json.NullValueHandling.Ignore
для вывода (сериализация), но использовать NullValueHandling.Include
для ввода (десериализация)?
Подробнее
Я создаю JSON API, используя ASP.NET Web API. Я хочу удалить ненужные нулевые значения из вывода, что легко сделать с помощью следующего кода:
config.Formatters.JsonFormatter.SerializerSettings =
new Newtonsoft.Json.JsonSerializerSettings {
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore
};
Однако при вводе я хочу использовать NullValueHandling.Include
для включения значений NULL и установки этих триггеров свойств на объектах моей модели.
Почему?
Эти установщики свойств выглядят следующим образом:
public long? Foo
{
get { return _Foo; }
set { _Foo = MarkApplied(nameof(Foo), value); }
}
, где MarkApplied
помнит, что свойство Foo
было установлено Explicity. Это позволяет мне определить разницу между входным объектом JSON:
{ Foo: 123, Bar: "bar" }
, который намеревается обновить свойство Foo
до 123
и свойство Bar
до "bar"
,
{ Foo: null, Bar: "bar" }
, который намеревается обновить свойство Foo
до null
и свойство Bar
до "bar"
и
{ Bar: "bar" }
, который намеревается обновить свойство Bar
до "bar"
и ничего не менять в свойстве Foo
(в отличие от установки null
).
Что не будет работать
Я уже рассматривал DefaultValueHandling
как вариант. С одной стороны, я действительно хочу это поведение только для нулевых значений, а не для чисел и логических значений, которые имеют значимые значения по умолчанию. Кроме того, Include
и Ignore
, кажется, в значительной степени соответствуют поведению NullValueHandling
, а параметры Populate
и IgnoreAndPopulate
не то, что мне нужно, потому что они будут вызывать установщики свойств, даже когда свойство не установлено. не включен во входной JSON.