我正在使用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.5
到3.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));