使用Newtonsoft.Json.JsonSerializer序列化十进制数。
如何设置只使用1位小数的十进制数字来序列化,以在末尾使用0。
例如:3.5 序列化为 "3.50"?
使用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"
}
注意 - 接受的答案对于提问者的具体问题即将3.5
序列化为"3.50"
是正确的,但我想要把3.5
序列化为3.50
(不带字符串引号)。
number.ToString(CultureInfo.InvariantCulture)
。这是正确的方法吗? - Denis535writer.WriteRawValue(FormattableString.Invariant($"{value:0.00}"));
- belchevreturn objectType == typeof(decimal) || objectType == typeof(decimal?);
,否则它将无法处理可为空的属性。 - Andrew Basarab嗨! 第二个答案也是正确的,但不反映文化。 如果你想要真正的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));
WriteRawValue
代替。 - Răzvan Flavius Pandawriter.WriteValue(string.Format(CultureInfo.InvariantCulture, "{0:N2}", value));
- belchev