【发布时间】:2013-07-26 03:43:00
【问题描述】:
我正在使用 Newtonsoft.Json.JsonSerializer 序列化小数。
如何将其设置为序列化只有 1 个小数位的十进制数以在末尾使用 0。
即3.5 序列化为“3.50”?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-4 json.net jsonserializer
我正在使用 Newtonsoft.Json.JsonSerializer 序列化小数。
如何将其设置为序列化只有 1 个小数位的十进制数以在末尾使用 0。
即3.5 序列化为“3.50”?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-4 json.net jsonserializer
您必须编写自己的自定义 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());
【讨论】:
WriteRawValue 代替
writer.WriteValue(string.Format(CultureInfo.InvariantCulture, "{0:N2}", value)); 格式化字符串
接受的答案是正确的,但在接受的答案上扩展了 cmets:
如果您希望 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(不带字符串引号)。
【讨论】:
number.ToString(CultureInfo.InvariantCulture)。方法对吗?
writer.WriteRawValue(FormattableString.Invariant($"{value:0.00}"));
return objectType == typeof(decimal) || objectType == typeof(decimal?);,否则它将无法与可为空的属性一起使用。
System.Text而不是newtonsoft时可以吗? stackoverflow.com/questions/71255259/…