关闭 Gson 双序列化中的科学记数法

2022-09-02 13:05:07

当我使用Gson序列化包含接近零的双精度值的对象时,它使用的是科学的E符号:

{"doublevaule":5.6E-4}

如何告诉Gson生成

{"doublevaule":0.00056}

相反?我可以实现一个自定义的JsonSerializer,但它返回一个JsonElement。我必须返回一个JsonPrimitive,其中包含一个双精度,无法控制如何序列化。

谢谢!


答案 1

为什么不为 ?(您可能必须重写要使用的对象而不是 )。DoubleDoubledouble

然后在序列化器中,您可以转换为 ,并使用刻度等。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-60.000009166666


答案 2

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