默认jackon行为似乎同时使用属性(getter和setter)和字段来序列化和反序列化为json。
我想使用字段作为序列化配置的规范源,因此不希望jackson查看所有属性。
我可以用注释在单个类的基础上做到这一点:
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
但我不想在每节课上都这么做……
是否可以全局配置?比如添加一些到对象映射器?
在Kotlin中使用数据类和方法是非常棘手的。例如在课堂上:
data class SomeClass(val foo: String, val bar: String, val isSomething: Boolean):Serializable { fun isEmpty() = foo.isEmpty() }
我得到json像:{"bar"="bar", "empty"=false, "foo"="foo", "isSomething"=true}
设置之后:setVisibility(PropertyAccessor. properties)IS_GETTER JsonAutoDetect.Visibility.NONE)
json是:{"bar"="bar", "foo"="foo"}
唯一的方法,我发现有isSomething和没有空是添加@JsonIgnore或@JvmSynthetic注释的isEmpty()
此外,有趣的事实是,添加像isFoo(): Boolean这样的方法只将foo序列化一次,作为字符串。
如果你想要一种方法来全局地做这件事,而不用担心你的ObjectMapper的配置,你可以创建你自己的注释:
@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonAutoDetect(
getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE,
setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE,
creatorVisibility = JsonAutoDetect.Visibility.NONE
)
public @interface JsonExplicit {
}
现在只需要用@JsonExplicit注释类就可以了!
还要确保编辑上述对@JsonAutoDetect的调用,以确保将值设置为适合程序的值。
感谢https://stackoverflow.com/a/13408807帮助我找到@JacksonAnnotationsInside
在Kotlin中使用数据类和方法是非常棘手的。例如在课堂上:
data class SomeClass(val foo: String, val bar: String, val isSomething: Boolean):Serializable { fun isEmpty() = foo.isEmpty() }
我得到json像:{"bar"="bar", "empty"=false, "foo"="foo", "isSomething"=true}
设置之后:setVisibility(PropertyAccessor. properties)IS_GETTER JsonAutoDetect.Visibility.NONE)
json是:{"bar"="bar", "foo"="foo"}
唯一的方法,我发现有isSomething和没有空是添加@JsonIgnore或@JvmSynthetic注释的isEmpty()
此外,有趣的事实是,添加像isFoo(): Boolean这样的方法只将foo序列化一次,作为字符串。
@自2.10版本我们可以使用JsonMapper。构建器和接受的答案可以如下所示:
JsonMapper mapper = JsonMapper.builder()
.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
.visibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
.visibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)
.visibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE)
.build();