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

@JsonDeserialize修饰类经Builder构建后Jackson序列化JSON为空如何解决

问题原因

Jackson默认序列化规则只会对两种字段生效:

  1. 访问修饰符为public的成员变量
  2. 带有public getter方法的私有成员变量

你当前AttackPattern类中的所有成员变量均为私有属性,且没有提供对应的public getter方法,因此Jackson执行序列化时找不到任何可输出的字段,最终得到空JSON。你类上加的@JsonDeserialize、Builder上的@JsonPOJOBuilder都是反序列化相关注解,对序列化逻辑没有影响。

另外你当前toJsonString方法存在冗余操作:先把对象序列化为字符串,再解析为JsonNode又转回字符串,完全是多余步骤,可以直接返回序列化结果。

解决方案

你可以任选以下任意一种方案解决:

  • 方案一:给所有需要序列化的私有字段添加对应的public getter方法
    示例:
    public String getName() {
        return name;
    }
    public String getDescription() {
        return description;
    }
    public Set<KillChainPhaseType> getKillChainPhases() {
        return killChainPhases;
    }
    // 其他需要序列化的字段也对应添加getter即可
    
  • 方案二:配置ObjectMapper支持序列化私有字段
    修改toJsonString方法中的ObjectMapper配置,开启私有字段的访问权限:
    public String toJsonString() {
        try {
            ObjectMapper mapper = new ObjectMapper();
            // 新增配置,允许序列化所有访问权限的字段
            mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
            return mapper.writeValueAsString(this);
        } catch (IOException e) {
            throw new IllegalStateException("Cannot process JSON", e);
        }
    }
    
  • 方案三:在需要序列化的字段上添加@JsonProperty注解
    直接给对应字段标记要被Jackson序列化:
    @JsonProperty
    private String name;
    @JsonProperty
    private String description;
    @JsonProperty("kill_chain_phases")
    private Set<KillChainPhaseType> killChainPhases;
    
额外注意事项

你Builder类上标注的@JsonPOJOBuilder(withPrefix = "set")指定了反序列化时builder方法前缀为set,但你实际的builder方法是name()、description()没有set前缀,后续如果要使用该类的Jackson反序列化能力,需要把withPrefix改为空字符串,或者给builder方法加上set前缀。

内容的提问来源于stack exchange,提问作者AnaGutiFontan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:45:03