You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jackson反序列化:Object转字符串列表/布尔值问题求助

问题:Jackson版本升级后ApiRequest类反序列化失败

背景

此前使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:18:12