JSON序列化的坑
2020-03-07 本文已影响0人
万物皆有序和公式
服务 A 从 Map 取出此 Id 字段,强转为 Long 时会出现类型转换异常。
最后定位到原因是 Json 反序列化 Map 时如果原始值小于 Int 最大值,反序列化后原本为 Long 类型的字段,变为了 Integer 类型
因此大家使用二方或者三方服务时,当对方返回的是 Map<String,Object> 类型的数据时要特别注意这个问题。
解决方案
作为服务提供方,可以采用 JDK 或者 Hessian 等序列化方式;
作为服务的使用方,我们不要从 Map 中一个字段一个字段获取和转换,可以使用 JSON 库直接将 Map 映射成所需的对象,这样做不仅代码更简洁还可以避免强转失败。
@Test
public void testFastJsonObject() {
Map<String, Object> map = new HashMap<>();
final String name = "name";
final String id = "id";
map.put(name, "张三");
map.put(id, 20L);
String fastJsonString = FastJsonUtil.getJsonString(map);
// 模拟拿到服务B的数据
Map<String, Object> mapFastJson = FastJsonUtil.parseJson(fastJsonString,map.getClass());
// 转成强类型属性的对象而不是使用map 单个取值
User user = new JSONObject(mapFastJson).toJavaObject(User.class);
// 正确
Assert.assertEquals(map.get(name), user.getName());
// 正确
Assert.assertEquals(map.get(id), user.getId());
}