ТЛ; др; В Newtonsoft JSON. NET как игнорировать значения по умолчанию для некоторых типов (перечислений), а не для других (целых)?
Моя команда использует библиотеку, которая использует буферы протокола для их хозяйствующие субъекты. Каждое перечисление в этой библиотеке / protobuf имеет значение по умолчанию 0, "ValueNotSet". Моя команда использует Newtonsoft JSON. NET для сериализации этих объектов. Вот разбавленный пример для инвентаря пекарни:
public enum Flavor { ValueNotSet, Cherry, Blueberry, Cheese };
public class DanishInventory { public int QtyInStock; public Flavor; }
Чтобы сэкономить ресурсы, мы не хотим сериализовать ValueNotSet
(сценарий реального мира имеет много перечислений), но наличие нулевого количества сыра в запасах - это действительный и мы делаем хотим сериализовать ноль. Из-за этого мы не можем использовать DefaultValueHandling = Ignore в настройках.
Я создал собственный JsonConverter, но к тому времени, когда вызывается запись Json (...), ключ уже находится в JsonWriter. Поэтому, если я ничего не пишу, JSON является недопустимым, и я не вижу очевидного метода, позволяющего переписать записывающее устройство для перезаписи ключа. Итак, как лучше всего игнорировать значения по умолчанию для некоторых типов (например, перечислений), но не для других (например, целых)?
Обратите внимание, что перечисления находятся в пакете NuGet и не могут быть изменены, например, путем добавления атрибутов. .