Java JSON 反序列化时的泛型处理

摘自: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);
posted @ 2025-05-22 20:16  Higurashi-kagome  阅读(168)  评论(0)    收藏  举报