Jackson NON_DEFAULT 把已经改过的数组字段省略了
数组默认值含 null,实际值换成非空后 JSON 里仍没这个字段。检查 NON_DEFAULT 的数组比较,不要把漏字段误判为 getter 未识别。
类使用 @JsonInclude(JsonInclude.Include.NON_DEFAULT),数组默认是 {null, "a"},实际改成 {"x", "a"} 后,序列化仍得到 {}。这时字段可能已经被发现,只是在默认值比较阶段被错误省略。
正式 Jackson 3.2.4 的数组默认比较器中,默认元素非 null 时才进一步比较;默认位置为 null、实际位置非 null 时,没有判定不等的分支。因此数组内容已经改变,也可能被视为默认值。不要据此把业务数据里的 null 全部替换成空字符串,两者含义不同。
需要可靠输出该字段,可以局部采用 ALWAYS
如果接口允许这个字段始终出现,可以仅覆盖该字段的包含规则:
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
public class Payload {
@JsonInclude(JsonInclude.Include.ALWAYS)
public String[] values = {null, "a"};
}
字段变成非空数组后,应按实际数组输出;默认数组本身也会输出。这是明确改变该字段的省略策略,不是修复全局比较器。接收方若把“缺失”和“显式默认值”区分为不同操作,需要先确认该策略适合接口,不能直接套用。
对于必须严格省略默认数组的协议,应在传输模型或专用 serializer 中明确定义数组相等规则,包括长度、null 位置和逐项比较,再保留项目已有的其他字段行为。不要直接修改本机依赖缓存,或把一个自定义比较对象随意替换进所有类型的过滤配置。
与字段未被识别分别检查
先比较同一个 mapper 下默认数组、只改 null 位置、只改非 null 位置、长度变化以及 null 数组引用。漏掉的是哪一类,能帮助区分数组比较、getter 发现或视图过滤等路径。
Jackson 3 getter 命名规则是另一个可能导致字段消失的原因,但改注解名称不会修复这里的默认数组比较。也不应只在输出端补一个空数组,把真正的非空元素丢掉。
当前正式 3.2.4 仍能核对到上述比较分支;开发分支中的修补不能直接当作已安装版本的行为。更换正式版本后,用同组数据检查差异字段确实出现、真正默认值仍符合既定省略约定,再移除局部兼容措施。


