关闭 Gson 双序列化中的科学记数法
当我使用Gson序列化包含接近零的双精度值的对象时,它使用的是科学的E符号:
{"doublevaule":5.6E-4}
如何告诉Gson生成
{"doublevaule":0.00056}
相反?我可以实现一个自定义的JsonSerializer,但它返回一个JsonElement。我必须返回一个JsonPrimitive,其中包含一个双精度,无法控制如何序列化。
谢谢!
当我使用Gson序列化包含接近零的双精度值的对象时,它使用的是科学的E符号:
{"doublevaule":5.6E-4}
如何告诉Gson生成
{"doublevaule":0.00056}
相反?我可以实现一个自定义的JsonSerializer,但它返回一个JsonElement。我必须返回一个JsonPrimitive,其中包含一个双精度,无法控制如何序列化。
谢谢!
为什么不为 ?(您可能必须重写要使用的对象而不是 )。Double
Double
double
然后在序列化器中,您可以转换为 ,并使用刻度等。BigDecimal
例如:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Double.class, new JsonSerializer<Double>() {
@Override
public JsonElement serialize(final Double src, final Type typeOfSrc, final JsonSerializationContext context) {
BigDecimal value = BigDecimal.valueOf(src);
return new JsonPrimitive(value);
}
});
gson = gsonBuilder.create();
以上将呈现(比如)为9.166666E-6
0.000009166666
Brian Agnew的答案有一个小小的改变:
public class DoubleJsonSerializer implements JsonSerializer<Double> {
@Override
public JsonElement serialize(final Double src, final Type typeOfSrc, final JsonSerializationContext context) {
BigDecimal value = BigDecimal.valueOf(src);
try {
value = new BigDecimal(value.toBigIntegerExact());
} catch (ArithmeticException e) {
// ignore
}
return new JsonPrimitive(value);
}
}