JsonSerializeR语言 使用'N2'格式序列化小数位



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

我如何将其设置为串行化只有1位小数的十进制数字,以便在末尾使用0。

即3.5串行化为"3.50"?

您必须编写自己的自定义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());

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

如果您希望JSON中的小数是数字而不是字符串,则需要使用WriteRawValue,并使用:0.00而不是:N2进行字符串格式设置(因为N2包含千个分隔符逗号和其他区域性特定的数字格式,这些格式会破坏JSON)

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();
    }
}

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

# writer.WriteRawValue($"{value:0.00}");
{
    "MyDecimal": 3.50,
    "MyBiggerDecimal": 12345.50
}
# writer.WriteValue($"{value:N2}");
{
    "MyDecimal": "3.50",
    "MyBiggerDecimal": "12,345.50"
}

注意-接受的答案对于OP的特定问题是正确的,即序列化3.5"3.50",但我在这里想要序列化3.53.50(没有字符串引号)。

Hy!第二个答案也是正确的,但不能反映文化。如果你想拥有真正的0.00(带.),你必须使用:

public class DecimalFormatConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(decimal);
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        FormattableString formattableString = $"{value:0.00}";
        writer.WriteRawValue(formattableString.ToString(CultureInfo.InvariantCulture));
    }
    public override bool CanRead => false;
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

这样就可以用点作为小数分隔符。

区别在于:

    FormattableString formattableString = $"{value:0.00}";
    writer.WriteRawValue(formattableString.ToString(CultureInfo.InvariantCulture));

相关内容

  • 没有找到相关文章

最新更新