@JsonDeserialize修饰类经Builder构建后Jackson序列化JSON为空如何解决
问题原因
Jackson默认序列化规则只会对两种字段生效:
- 访问修饰符为
public的成员变量 - 带有
publicgetter方法的私有成员变量
你当前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
相关产品推荐
相关产品推荐

