1 回答

TA貢獻1856條經(jīng)驗 獲得超5個贊
解決這個問題有兩個因素。
第一:如果沒有指定 @JsonProperty 字段,
Jackson 默認使用 Java bean 命名約定來暗示 json 字段名稱(對于布爾字段,其 getter/setter 的命名約定是什么? )。我測試了代碼,序列化適用于 JacksonError 類,因為有一個 getter 符合 bean 訪問器的 Java 命名標準。然而,在反序列化時,它看起來是通過名稱“setSomething()”訪問一個 getter。如果您觀察到,具有 setSomething 方法的類不會出現(xiàn)反序列化錯誤。
第二:沒有為 JacksonError 類生成 setSomething() 方法的原因是因為它是一個 val 字段并且它不生成 setter(val 字段是不可變的并且僅在構(gòu)造函數(shù)中初始化,因此沒有 setter)。就像@Erwin Bolwidt 建議的那樣,您可以將以下屬性設(shè)置為對象映射器以包含 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 的自動檢測
添加回答
舉報