Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java kotlin数据类Jackson@JsonProperty注释的使用_Java_Json_Jackson_Kotlin_Deserialization - Fatal编程技术网

Java kotlin数据类Jackson@JsonProperty注释的使用

Java kotlin数据类Jackson@JsonProperty注释的使用,java,json,jackson,kotlin,deserialization,Java,Json,Jackson,Kotlin,Deserialization,kotlin 1.2.10 杰克逊模块kotlin:2.9.0 我在kotlin中拥有以下数据类: data class CurrencyInfo( @JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem? ) @JsonInclude(JsonInclude.Include.NON_NULL) data class CurrencyInfoItem( @JsonProperty("is

kotlin 1.2.10 杰克逊模块kotlin:2.9.0

我在kotlin中拥有以下数据类:

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-docs的说法@JsonProperty应该被分配给getter/setter/fields

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

否则,此问题是否可以通过某些jackson设置来解决

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

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)

您可以通过调用方法
setPropertyNamingStrategy(…)
从jackson库配置ObjectMapper

使用
PropertyNamingStrategy.SNAKE\u CASE
可以解决您的问题


另请参见此处的其他可用策略:

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

@JsonAutoDetect(fieldVisibility = Visibility.ANY)
data class CurrencyInfo(
    @JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem?
)
或者,您也可以在访问器方法上移动注释:

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

您可以添加
jackson模块kotlin
()并向jackson注册kotlin模块:

val mapper = ObjectMapper().registerModule(KotlinModule())

然后它(和许多其他东西)自动工作。

您可以这样做:

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,如下所示:

{"currency_info":{"iso_4217":"CAD","name":"Canadian Dollar","imerchantAccount":0,"ixrateSource":2}}
第一(并非完全不变):

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


我今天遇到了这个问题,我所做的是在ObjectMapper()中注册KotlinModule()。下面是一个例子

@Bean fun objectMapper = ObjectMapper().registreModule(KotlinModule())

在上面,它是一个虚拟的objectMapper,我认为您应该在objectMapper中添加其他配置,如序列化程序等等。Kotlin不支持@param和@get注释作为一个注释,因此我们必须编写这样的代码:

data class User(
    @param:JsonProperty("id") @get:JsonProperty("id") val id: Int,
    @param:JsonProperty("name") @get:JsonProperty("name") val name: String
)
在这里,您可以告诉JetBrain的伙计们支持此功能并允许:

data class User(
    @JsonProperty("id") val id: Int,
    @JsonProperty("name") val name: String
)

此问题在中得到解决

    https://github.com/FasterXML/jackson-module-kotlin/issues/237
或者你也可以使用

    data class SignRequest{
        @param:JsonProperty("estamp_request")
        @get:JsonProperty("estamp_request")
        val eStamp: EstampRequest?
    }

    data class EstampRequest(
        val tags: Map<String,Int>
    )

数据类签名请求{
@参数:JsonProperty(“estamp_请求”)
@get:JsonProperty(“estamp_请求”)
val eStamp:EstampRequest?
}
数据类EstampRequest(
val标签:地图
)

谢谢,这是个好主意,我已经试过了。但是默认的SNAKE_案例翻译的实现很差。许多字段的解析不正确。例如,iso4217->未翻译为iso_4217,iXRateSource->i_x_rate_source等等,我设置了可见性修饰符globallyI have
jackson-annotations-2.9.0
,并且没有
PRIVATE
选项。我尝试了使用
ANY
,但该属性仍然被忽略。使用
@param:JsonProperty(“”
的属性也很重要,如果您试图将其复制到在获取值时没有发生的事情上,即在构造时发生的自定义Json反序列化程序。它从一开始就被使用。你甚至可以在问题帖中检查初始化情况。@Mike是的,我错过了那个。不过,它确实帮了我的忙。到目前为止,这是最好的答案:注册此模块不仅解决了问题,而无需键入
@get:
或使用其他调整,而且总体上改进了KotlinJackson的互操作性。您只需要.setVisibility(PropertyAccessor.FIELD,JsonAutoDetect.Visibility.ANY)。setVisibility(PropertyAccessor.IS_GETTER,JsonAutoDetect.Visibility.NONE)。问题取决于对“IS”GETTER的特定处理
    data class SignRequest{
        @param:JsonProperty("estamp_request")
        @get:JsonProperty("estamp_request")
        val eStamp: EstampRequest?
    }

    data class EstampRequest(
        val tags: Map<String,Int>
    )