JsonSerializer - 使用'N2'格式序列化小数位

时间:2013-07-26 02:04:10

标签: asp.net-mvc asp.net-mvc-4 json.net jsonserializer

我正在使用Newtonsoft.Json.JsonSerializer序列化小数。

如何将其设置为序列化十进制数,只有1位小数,最后使用0。

即。 3.5序列化为“3.50”?

2 个答案:

答案 0 :(得分:28)

您必须编写自己的自定义JsonConverter并使用它来拦截decimal类型,以便您可以更改序列化的方式。这是一个例子:

public class DecimalFormatConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(decimal));
    }

    public override void WriteJson(JsonWriter writer, object value, 
                                   JsonSerializer serializer)
    {
        writer.WriteValue(string.Format("{0:N2}", value));
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override object ReadJson(JsonReader reader, Type objectType,
                                 object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();    
    }
}   

要使用它,只需将此自定义转换器的新实例传递给SerializeObject方法:

var json = JsonConvert.SerializeObject(yourObject, new DecimalFormatConverter());

答案 1 :(得分:2)

接受的答案是正确的,但扩展了对接受的答案的评论:

如果您希望JSON中的小数点是数字而不是字符串,则需要使用WriteRawValue并在:0.00上使用:N2来设置字符串格式(如{{1 }}包含千位分隔符和其他会破坏JSON的区域性特定数字格式)

N2

这是与接受的答案相比输出的差异。

public class DecimalFormatConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(decimal);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteRawValue($"{value:0.00}");
    }

    public override bool CanRead => false;

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

注意-对于OP的特定问题(即将# writer.WriteRawValue($"{value:0.00}"); { "MyDecimal": 3.50, "MyBiggerDecimal": 12345.50 } # writer.WriteValue($"{value:N2}"); { "MyDecimal": "3.50", "MyBiggerDecimal": "12,345.50" } 序列化为3.5而言,可接受的答案是正确的,但是我到达这里是想将"3.50"序列化为3.5(没有字符串引号)。