十进制属性已序列化,甚至未填充

时间:2019-06-12 08:31:51

标签: c# json serialization json.net

我不得不从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 :(得分:0)

由于其类型为decimal原语,因此默认情况下将具有某些值。我认为您需要自己实现序列化工具Newtonsoft.Json使用。不包含十进制值0.0的位置(如果这适合业务逻辑)。

另一个选择是不使用原始类,然后设置在序列化时删除null值的属性。我相信您可以在Newtonsoft中设置此配置参数。

检查以下内容:https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm

答案 1 :(得分:0)

您可以将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

答案 2 :(得分:0)

就我而言,我将原始类型更改为可为空。

stop_node

这对我有用。我更喜欢@Brian Rogers的答案。 :)