我有一个使用对象数据类型的属性定义的类
public class Field {
private Object value = null;
}
执行以下操作时
Map<String,Object> map Object = new HashMap<String,Object>();
Field field = new Field();
f1.value = 1;
Map<String, Object> fieldMap = new ObjectMapper().convertValue(field, Field.class);
Gson gson = new GsonBuilder();
JsonElement jsonElement = gson.toJsonTree(fieldMap);
Field field = gson.fromJson(jsonElement, Field.class);
如果我们访问 field.value,它会返回 1.0 而不是 1。 我观察到这种转换发生在 GSON 的原始转换之前。 看起来对象数据类型正在将 JSON“1”中的字符串转换为双精度而不是整数。
有什么方法可以覆盖这个默认行为吗?
我尝试使用 Jackson Converter 而不是 GSON,但没有成功。 我期望响应是整数而不是双精度值。
下面将介绍您的代码中使用Gson的部分。一般来说,避免混合使用多个 JSON 库,可以使用 Gson 或 Jackson,但不能同时使用两者(尤其不要使用同一方法)。它只会引起混乱和问题,例如Jackson 注释不被 Gson 识别,反之亦然。
当您将 JSON 数字反序列化为
Object
时,Gson 默认情况下始终将其解析为 Double
,无论数字的格式如何。1
解析为 Double
,另一个应用程序解析为 Integer
,另一个应用程序解析为 Long
;这里没有“正确”的选择。
相反,如果可能,您应该将类型
Object
更改为更具体的类型,例如 Integer
。如果这不可能,您有以下替代方案:
GsonBuilder#setObjectToNumberStrategy
指定 Gson 应如何将 JSON 数字转换为 Object
。ToNumberPolicy
变体之一,或编写自己的 ToNumberStrategy
;您可以使用 Gson 的 ToNumberPolicy
代码作为如何执行此操作的帮助。Object
注释
@JsonAdapter
字段,并创建一个解析该值的自定义 TypeAdapter
。