@JsonValue 只能标注一个非 void 且非 void 泛型的 public 方法或字段(推荐用 getter);
如果标注两个,Jackson 会直接报错;
该注解只管序列化(Java → JSON),反序列化(JSON → Java)需要配合 @JsonCreator 或默认构造器加 setter。上面代码中的 data 是只读 final 字段,因此建议补充一个带参数的 @JsonCreator 构造器来支持反序列化;
List> 在序列化时类型不够明确,建议使用 List 或更稳妥的 List——因为 long 和 double 都属于 Number。
完整示例:同时支持序列化与反序列化
public class DataPoint {
private final List data;
public DataPoint(long date, double counts) {
this.data = List.of(date, counts);
}
@JsonCreator
public DataPoint(@JsonProperty("data") List data) {
if (data == null || data.size() != 2) {
throw new IllegalArgumentException("DataPoint requires exactly 2 numbers");
}
this.data = data;
}
@JsonValue
public List getData() {
return data;
}
}