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();
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);
}
}
.registerTypeAdapter(Double.class, new JsonSerializer<Double>() {
@Override
public JsonElement serialize(final Double src, final Type typeOfSrc, final JsonSerializationContext context) {
Number n = new Number() {
@Override
public long longValue() {
return 0;
}
@Override
public int intValue() {
return 0;
}
@Override
public float floatValue() {
return 0;
}
@Override
public double doubleValue() {
return 0;
}
@Override
public String toString() {
return new BigDecimal(src).toPlainString();
}
};
return new JsonPrimitive(n);
}
})
7条答案
按热度按时间yzckvree1#
为什么不为
Double
提供一个新的序列化程序呢?(您可能需要重写对象以使用Double
而不是double
)。然后在串行器中,您可以将其转换为
BigDecimal
,并使用刻度等进行操作。例如:
上面的代码将
9.166666E-6
渲染为0.000009166666
a14dhokn2#
Brian Agnew's answer上的一个小更改:
rjee0c153#
您可以尝试扩展
JsonWriter
并重写方法value(double)
它似乎不适合像这样修改(您几乎需要复制现有代码),但应该可以让它工作。
不幸的是,我看不出有其他原因影响输出格式。
whlutmcx4#
为
Double
创建自定义序列化程序之前:{“金额”:1.0E9英寸}
之后:{“金额”:“100000000”}
因为它是JSON中的一个字符串,所以并不完美。
yhqotfr85#
GSON内部使用Number#toString,所以我们只需要创建一个Number的新示例:
i5desfxk6#
与Kotlin:
bwntbbo37#
由于某种原因,我无法像很多人建议的那样,用BigDecimal来解决问题,所以我不得不这样写: