Как использовать атрибут [DefaultValue] для игнорирования свойств boolean = true в сериализации JSON.C#

Место общения программистов C#
Ответить
Anonymous
 Как использовать атрибут [DefaultValue] для игнорирования свойств boolean = true в сериализации JSON.

Сообщение Anonymous »

Это дополнительный вопрос к Игнорировать логическое свойство = true в сериализации JSON.
У меня есть запись с несколькими свойствами bool, некоторые из них имеют значение по умолчанию true, а некоторые false:

Код: Выделить всё

private record MyRecord()
{
public bool BoolProperty1 { get; init; } // default false
public bool BoolProperty2 { get; init; } // default false
[DefaultValue(true)] public bool BoolProperty3 { get; init; } = true;
[DefaultValue(true)] public bool BoolProperty4 { get; init; } = true;
}
Я хочу игнорировать «XXX»:true в сериализованной строке JSON для свойств со значением по умолчанию true. Другими словами, если свойство bool украшено атрибутом [DefaultValue(true)] и имеет значение true, я хочу, чтобы это свойство было исключено из результирующего представления JSON. К сожалению, сериализатор .NET JSON не учитывает атрибут DefaultValue.
Вот демонстрация желательного поведения:

Код: Выделить всё

JsonSerializerOptions options = new();
options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault;

MyRecord obj = new();
Console.WriteLine($"Object: {obj}"); // OK
string json = JsonSerializer.Serialize(obj, options);
Console.WriteLine($"JSON: {json}"); // Not OK
Вывод:

Код: Выделить всё

Object: MyRecord { BoolProperty1 = False, BoolProperty2 = False, BoolProperty3 = True, BoolProperty4 = True }
JSON: {"BoolProperty3":true,"BoolProperty4":true}
Желаемый результат должен быть следующим:

Код: Выделить всё

Object: MyRecord { BoolProperty1 = False, BoolProperty2 = False, BoolProperty3 = True, BoolProperty4 = True }
JSON: {}
Онлайн-демо.
На мой первоначальный вопрос я получил отличный ответ от Гуру Строна, в котором показано, как обрабатывать сериализацию всех свойств bool моего типа с помощью API JsonPropertyInfo.ShouldSerialize. В этом ответе я ищу что-то более обобщенное и продвинутое: как добиться желаемой сериализации JSON с помощью атрибута [DefaultValue(true)]. Возможно ли это?

Подробнее здесь: https://stackoverflow.com/questions/798 ... rties-in-j
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»