对 kotlin 数据类使用 Jackson @JsonProperty 注释

新手上路,请多包涵

科特林 1.2.10 杰克逊模块科特林:2.9.0

我在科特林中有以下数据类:

 data class CurrencyInfo(
        @JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem?
)

@JsonInclude(JsonInclude.Include.NON_NULL)
data class CurrencyInfoItem(
        @JsonProperty("iso_4217") var iso4217: String?,
        @JsonProperty("name") var name: String?,
        @JsonProperty("name_major") var nameMajor: String?,
        @JsonProperty("name_minor") var nameMinor: String?,
        @JsonProperty("i_ma_currency") var iMaCurrency: Int?,
        @JsonProperty("i_merchant_account") var iMerchantAccount: Int?,
        @JsonProperty("i_x_rate_source") var iXRateSource: Int?,
        @JsonProperty("base_units") var baseUnits: Double?,
        @JsonProperty("min_allowed_payment") var minAllowedPayment: Int?,
        @JsonProperty("decimal_digits") var decimalDigits: Int?,
        @JsonProperty("is_used") var isUsed: Boolean?
)

当我尝试反序列化此数据类时,我得到以下信息:

 {"currency_info":{"iso_4217":"CAD","name":"Canadian Dollar","imerchantAccount":0,"ixrateSource":2}}

如您所见,最后两个选项反序列化不正确。这个问题可以通过直接给 getter @get:JsonProperty 添加注解来解决。但是,根据 jackson 文档 @JsonProperty 应该分配给 getters/setters/fields

所以,我想问一下,有没有一种可靠的方法可以在 kotlin 中为 jackson 注释属性以进行正确的序列化/反序列化(此外,我所有的数据类都是自动生成的,因此很难分别为 getter 创建一些两行/三行注释和二传手)

否则,这个问题可以通过一些杰克逊设置来解决吗?

根据下面的答案,以下对我有用

private 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)

原文由 Mike 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

@JsonProperty 代码中的注释都放在数据类中的私有字段上,默认情况下 Jackson 不会扫描私有字段以获取注释。您必须通过放置 @JsonAutoDetect 注释来指示它执行其他操作:

 @JsonAutoDetect(fieldVisibility = Visibility.ANY)
data class CurrencyInfo(
    @JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem?
)

或者您可以在访问器方法上移动注释:

 data class CurrencyInfo(
    @get:JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem?
)

原文由 SimY4 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以这样做:

 data class CurrencyInfo @JsonCreator constructor (
        @param:JsonProperty("currency_info")
        @get:JsonProperty("currency_info")
        val currencyInfo: CurrencyInfoItem?
)

上面的代码转换为 java 为:

 public final class CurrencyInfo {
   @Nullable
   private final String currencyInfo;

   @JsonProperty("currency_info")
   @Nullable
   public final String getCurrencyInfo() {
      return this.currencyInfo;
   }

   @JsonCreator
   public CurrencyInfo(@JsonProperty("currency_info") @Nullable String currencyInfo) {
      this.currencyInfo = currencyInfo;
   }
}


来自已接受答案的代码转换为 java,如下所示:

首先(不是纯粹的不可变的):

 @JsonAutoDetect(
   fieldVisibility = Visibility.ANY
)
public final class CurrencyInfo {
   @Nullable
   private String currencyInfo;

   @Nullable
   public final String getCurrencyInfo() {
      return this.currencyInfo;
   }

   public final void setCurrencyInfo(@Nullable String var1) {
      this.currencyInfo = var1;
   }

   public CurrencyInfo(@JsonProperty("currency_info") @Nullable String currencyInfo) {
      this.currencyInfo = currencyInfo;
   }
}

第二(可能有反序列化问题):

 public final class CurrencyInfo {
   @Nullable
   private final String currencyInfo;

   @JsonProperty("currency_info")
   @Nullable
   public final String getCurrencyInfo() {
      return this.currencyInfo;
   }

   public CurrencyInfo(@Nullable String currencyInfo) {
      this.currencyInfo = currencyInfo;
   }
}

原文由 Maksim Turaev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题