1 回答
TA贡献1856条经验 获得超5个赞
解决这个问题有两个因素。
第一:如果没有指定 @JsonProperty 字段,
Jackson 默认使用 Java bean 命名约定来暗示 json 字段名称(对于布尔字段,其 getter/setter 的命名约定是什么? )。我测试了代码,序列化适用于 JacksonError 类,因为有一个 getter 符合 bean 访问器的 Java 命名标准。然而,在反序列化时,它看起来是通过名称“setSomething()”访问一个 getter。如果您观察到,具有 setSomething 方法的类不会出现反序列化错误。
第二:没有为 JacksonError 类生成 setSomething() 方法的原因是因为它是一个 val 字段并且它不生成 setter(val 字段是不可变的并且仅在构造函数中初始化,因此没有 setter)。就像@Erwin Bolwidt 建议的那样,您可以将以下属性设置为对象映射器以包含 jackson 的 kotlin 模块
val mapper = ObjectMapper().registerKotlinModule() .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY) .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE)
ObjectMapper().registerKotlinModule :这注册了有助于序列化/反序列化 kotlin 类的模块。
setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY) :使所有字段可序列化,包括私有字段(在您的情况下为 val 字段)
.setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE) : Makes sure any static / factory constructors are not autodetected .setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE) :
所有这些道具都通知对象映射器忽略任何 getters/setters 和 boolean setters 的自动检测
添加回答
举报