默认jackon行为似乎同时使用属性(getter和setter)和字段来序列化和反序列化为json。
我想使用字段作为序列化配置的规范源,因此不希望jackson查看所有属性。
我可以用注释在单个类的基础上做到这一点:
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
但我不想在每节课上都这么做……
是否可以全局配置?比如添加一些到对象映射器?
这个怎么样:我把它和mixin一起用了
不一致的对象
@Entity
@Getter
@NoArgsConstructor
public class Telemetry {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long pk;
private String id;
private String organizationId;
private String baseType;
private String name;
private Double lat;
private Double lon;
private Instant updateTimestamp;
}
混合:
@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
public static class TelemetryMixin {}
用法:
ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class);
Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class);
没有人说你不能在任意数量的类中应用相同的mixin。
如果您不熟悉mixin,那么它们在概念上很简单:mixin的结构是超级强加在目标类上的(根据jackson的说法,就JVM而言不是这样)。
这个怎么样:我把它和mixin一起用了
不一致的对象
@Entity
@Getter
@NoArgsConstructor
public class Telemetry {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long pk;
private String id;
private String organizationId;
private String baseType;
private String name;
private Double lat;
private Double lon;
private Instant updateTimestamp;
}
混合:
@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE)
public static class TelemetryMixin {}
用法:
ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class);
Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class);
没有人说你不能在任意数量的类中应用相同的mixin。
如果您不熟悉mixin,那么它们在概念上很简单:mixin的结构是超级强加在目标类上的(根据jackson的说法,就JVM而言不是这样)。
特别是对于布尔is*() getter:
我花了很多时间来解释为什么都没有
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
也不是这
setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
适用于我的布尔Getter/Setter。
解决方法很简单:
@JsonAutoDetect(isGetterVisibility = Visibility.NONE, ...
setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
spring-boot允许配置:
jackson:
visibility.field: any
visibility.getter: none
visibility.setter: none
visibility.is-getter: none
参见通用应用程序属性# JACKSON