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

kon*_*tin 17 java format double json gson

当我使用Gson序列化包含接近零的double值的Object时,它正在使用科学的电子符号:

{"doublevaule":5.6E-4}
Run Code Online (Sandbox Code Playgroud)

我如何告诉Gson生成

{"doublevaule":0.00056}
Run Code Online (Sandbox Code Playgroud)

代替?我可以实现自定义JsonSerializer,但它返回一个JsonElement.我将不得不返回一个包含double的JsonPrimitive,它无法控制序列化的方式.

谢谢!

Bri*_*new 11

为什么不提供新的序列化器Double?(您可能必须重写您的对象Double而不是double).

然后在序列化器中,您可以转换为a 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();
Run Code Online (Sandbox Code Playgroud)

以上将呈现(说)9.166666E-60.000009166666


Ron*_*ein 5

布莱恩·阿格纽的答案有一个小小的改变:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Joa*_*uer 2

您可以尝试扩展JsonWriter并覆盖该方法value(double)

它似乎不是为了像这样修改而构建的(您几乎需要复制现有代码),但应该可以让它工作。

不幸的是,我认为没有其他原因会影响输出格式。