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-6为0.000009166666
布莱恩·阿格纽的答案有一个小小的改变:
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)
您可以尝试扩展JsonWriter并覆盖该方法value(double)
它似乎不是为了像这样修改而构建的(您几乎需要复制现有代码),但应该可以让它工作。
不幸的是,我认为没有其他原因会影响输出格式。