Jackson反序列化:Object转字符串列表/布尔值问题求助
背景
此前使用jackson-databind 2.8.11.3 + Java 8时,ApiRequest类作为API请求体可正常反序列化及生成JSON字符串。该类的fields字段中,values支持接收字符串列表或布尔值,示例JSON如下:
{ "fields":[ { "key": "colors", "values": ["blue","red"] }, { "key": "metal", "values": true } ] }
升级后报错信息
升级到jackson-databind 2.13.2.2 + Java 11后,运行JSON生成单元测试时出现如下错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot
construct instance of 'com...' (no Creators, like default constructor,
exist): cannot deserialize from Object value (no delegate- or
property-based Creator) at [Source: (File) .. (through reference
chain: com...ApiRequest["fields"])at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1904)
原类代码片段
@Data @Builder @JsonInclude(JsonInclude.Include.NON_NULL) public class ApiRequest { private List<Fields> fields; @Data @Builder public static class Fields { private String key; private Object values; } }
尝试过的无效方案
为Fields类添加自定义反序列化器,但问题未解决:
修改后的ApiRequest类:
@Data @Builder @JsonInclude(JsonInclude.Include.NON_NULL) public class ApiRequest { private List<Fields> fields; @Data @Builder @JsonDeserialize(using = FieldDeserializer.class) // 新增该注解 public static class Fields { private String key; private Object values; } }
自定义反序列化器代码:
public class FieldDeserializer extends JsonDeserializer<ApiRequest.Fields> { @Override public ApiRequest.Fields deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { JsonNode node = jp.getCodec().readTree(jp); String key = node.get("key"); JsonNode valuesNode = node.get("values"); Object values = null; if (valuesNode.isArray()) { List<String> listValues = new ArrayList<>(); valuesNode.forEach(elementNode -> listValues.add(elementNode.asText())); values = listValues; } else if (valuesNode.isBoolean()) { values = valuesNode.asBoolean(); } return new ApiRequest.Fields.builder().key(key).values(values).build(); } }
求助
恳请提供解决该反序列化问题的建议或思路。
内容的提问来源于stack exchange,提问作者Zelda

