文章目录
-
- [1. 问题](#1. 问题)
- [2. 解决方案](#2. 解决方案)
-
- [2.1 实现反序列化器](#2.1 实现反序列化器)
- [2.2 通过 MIXMIN 和 @JsonCreator机制实现](#2.2 通过 MIXMIN 和 @JsonCreator机制实现)
- [3. 测试](#3. 测试)
1. 问题
在对外部代码或项目中明确不能提供无参构造函数的实例进行反序列化时,Jackson 会报找不到构造器的错误提示信息。那么如何在不修改代码的前提下实现反序列呢?
2. 解决方案
2.1 实现反序列化器
Response
Response 对象没有提供无参构造函数,但是要实现反序列化功能。
java
@Setter
@Getter
public class Response {
private Map<String, String> headerMap;
private Map<String, String> apiMap;
public Response(Map<String, String> headerMap, Map<String, String> apiMap) {
this.headerMap = headerMap;
this.apiMap = apiMap;
}
}
ResponseDeserializer
此时,可以通过实现 JsonDeserializer<Response> 接口,实现自定义反序列化器。
java
public class ResponseDeserializer extends JsonDeserializer<Response> {
@Override
public Response deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
Map<String, Map<String, String>> map = jsonParser.readValueAs(Map.class);
Map<String, String> headerMap = map.get("headerMap");
Map<String, String> apiMap = map.get("apiMap");
return new Response(headerMap, apiMap);
}
}
ObjectMapperUtil
将反序列化器注册到 ObjectMapper 中:
java
public class ObjectMapperUtil {
private static ObjectMapper objectMapper = new ObjectMapper();
static {
SimpleModule simpleModule = new SimpleModule("custom");
simpleModule.addDeserializer(Response.class, new ResponseDeserializer());
objectMapper.registerModule(simpleModule);
}
public static ObjectMapper getObjectMapper() {
return objectMapper;
}
/**
*
* @param object
* @return
*/
public static String writeAsPrettyString(Object object) {
try {
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
2.2 通过 MIXMIN 和 @JsonCreator机制实现
ResponseMixin
首先实现 @JsonCreator 功能的构造器:
java
public class ResponseMixin {
@JsonCreator
public ResponseMixin(@JsonProperty("headerMap")Map<String, String> headerMap,
@JsonProperty("apiMap")Map<String, String> apiMap) {
}
}
3. 测试
ResponseTest
java
// Jackson 解决没有无参构造函数的反序列化问题 - https://segmentfault.com/a/1190000041734426
public class ResponseTest {
@Test
public void testUseSelfDeserializeWithoutNoArgsConstructor() throws JsonProcessingException {
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Content-Type", "application/json");
headerMap.put("Content-Length", "123");
Map<String, String> apiMap = new HashMap<>();
apiMap.put("user", "用户");
apiMap.put("admin", "管理员");
Response response = new Response(headerMap, apiMap);
String jsonStr = ObjectMapperUtil.getObjectMapper().writeValueAsString(response);
System.out.println(jsonStr);
response = ObjectMapperUtil.getObjectMapper().readValue(jsonStr, Response.class);
System.out.println(response != null);
}
@Test
public void testUseMixin() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(Response.class, ResponseMixin.class);
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Content-Type", "application/json");
headerMap.put("Content-Length", "123");
Map<String, String> apiMap = new HashMap<>();
apiMap.put("user", "用户");
apiMap.put("admin", "管理员");
Response response = new Response(headerMap, apiMap);
String jsonStr = objectMapper.writeValueAsString(response);
System.out.println(jsonStr);
response = objectMapper.readValue(jsonStr, Response.class);
System.out.println(response != null);
}
}