Десятичные свойства сериализуются, даже не заполняются - PullRequest
0 голосов
/ 12 июня 2019

Мне пришлось сгенерировать некоторые классы из файла xsd. Классы и свойства генерируются правильно с аннотацией сериализации xml. Проблема в том, что десятичные свойства класса сериализуются с помощью Newtonsoft. Json даже не заполняется. Я хотел бы сериализовать только десятичные свойства, которые правильно заполнены. Сумма является частью SaleMessage Например:

class Amount
{
[System.Xml.Serialization.XmlAttributeAttribute()]
public decimal RequestedAmount;

[System.Xml.Serialization.XmlAttributeAttribute()]
public decimal CashBackAmount;

[System.Xml.Serialization.XmlAttributeAttribute()]
public decimal TipAmount;
}

//Usage
var amount = new Amount()
{
 RequestedAmount = 12.0
}

Используя эту структуру, она всегда будет сериализовать все свойства как это {"RequestedAmount":12.0,"CashBackAmount":0.0,"TipAmount":0.0} Что не является ожидаемым поведением. Вопрос в том, как изменить сериализацию, чтобы не анализировать не установленные свойства

 static string Serialize(SaleMessage saleMessage)
        {
            var serialize= JsonConvert.SerializeObject(saleToPoiMessage,
                new StringEnumConverter(),
                new IsoDateTimeConverter() { DateTimeFormat = DateTimeFormat });
            return serialize;
        }

Любая помощь приветствуется:)

Ответы [ 3 ]

0 голосов
/ 12 июня 2019

Можно установить для параметра DefaultValueHandling значение Ignore, чтобы подавить сериализацию значений, равных их значению по умолчанию.

var settings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> 
    { 
        new StringEnumConverter(),
        new IsoDateTimeConverter() { DateTimeFormat = DateTimeFormat } 
    },
    DefaultValueHandling = DefaultValueHandling.Ignore
};

var json = JsonConvert.SerializeObject(saleMessage, settings);

Скрипка: https://dotnetfiddle.net/o32k0U

0 голосов
/ 15 июня 2019

В моем случае я изменил примитивные типы на nullable.

public decimal? CashBackAmount {get; set;}

Это сработало для меня. Я предпочитаю ответ @Brian Rogers. :)

0 голосов
/ 12 июня 2019

Поскольку он имеет тип decimal примитив, он будет иметь некоторое значение по умолчанию. Я думаю, вам нужно реализовать утилиту сериализатора, которую использует Newtonsoft.Json - самостоятельно. Где вы не будете включать десятичные значения 0,0 (если это соответствует бизнес-логике).

Другой вариант - не использовать примитивный класс, а затем настроить свойство удаления значений null при сериализации. Я полагаю, вы можете настроить этот параметр конфигурации в Newtonsoft.

Проверьте это: https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...