Java JSON 反序列化时的泛型处理
Fastjson
Fastjson 处理泛型比较简单,只需要定义需要泛型处理的com.alibaba.fastjson.TypeReference
就可以,一段代码实现:
ApiResult<DemoVo> api = JSONObject.parseObject(json, new TypeReference<ApiResult<DemoVo>>() {});
也可以先定义一个java.lang.reflect.Type
,然后再使用这个 Type:
Type type = new TypeReference<ApiResult<DemoVo>>() {}.getType();
ApiResult<DemoVo> api = JSONObject.parseObject(json, type);
Jackson
Jackson 与 Fastjson 类似,可以定义一个com.fasterxml.jackson.core.type.TypeReference
,然后在反序列化时使用它:
ObjectMapper mapper = new ObjectMapper();
// 反序列化的时候如果多了其他属性,不抛出异常
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 如果是空对象的时候,不抛异常
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 指定引用的泛型
TypeReference<ApiResult<DemoVo>> type = new TypeReference<ApiResult<DemoVo>>(){};
ApiResult<DemoVo> api = mapper.readValue(json, type);
或者定义com.fasterxml.jackson.databind.JavaType
,依次指定主体类 class,和多个泛型类 class:
ObjectMapper mapper = new ObjectMapper();
// 反序列化的时候如果多了其他属性,不抛出异常
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 如果是空对象的时候,不抛异常
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 依次指定主体 class,n 个泛型 class
JavaType javaType = mapper.getTypeFactory().constructParametricType(ApiResult.class, DemoVo.class);
ApiResult<DemoVo> api = mapper.readValue(json, javaType);
Gson
Gson 处理也是类似的,需要定义一个com.google.gson.reflect.TypeToken
并且在反序列化时使用它:
Type type = new TypeToken<ApiResult<DemoVo>>() {}.getType();
Gson gson = new GsonBuilder().create();
ApiResult<DemoVo> api = gson.fromJson(json, type);