【问题标题】:How does Jackson marshalling work with Kotlin data class?Jackson 编组如何与 Kotlin 数据类一起使用?
【发布时间】:2021-10-13 13:13:32
【问题描述】:

我有一个从 REST 端点返回的简单数据类。

data class SummarizedReturn(
    val NET_CASH_FLOW: BigDecimal,
    val ROI_PERCENTAGE: BigDecimal
)

返回时,对象如下所示:

{
    summarizedReturn: {
        net_CASH_FLOW: -194703.12028723184,
        roi_PERCENTAGE: -35,
    }
}

这不是我需要的。我需要所有字母大写。所以我添加了JsonProperty注解

data class SummarizedReturn(
    @JsonProperty("NET_CASH_FLOW")
    val NET_CASH_FLOW: BigDecimal,
    @JsonProperty("ROI_PERCENTAGE")
    val ROI_PERCENTAGE: BigDecimal,
)

这并没有改变任何东西。我仍然得到与上面相同的结果。

然后我更改了属性名称并保留了注释

data class SummarizedReturn(
    @JsonProperty("NET_CASH_FLOW")
    val netCashFlow: BigDecimal,
    @JsonProperty("ROI_PERCENTAGE")
    val roiPercentage: BigDecimal,
)

这返回了我想要的。

{
    summarizedReturn: {
        NET_CASH_FLOW: -194703.12028723184,
        ROI_PERCENTAGE: -35,
    }
}

为什么注释在类的初始版本上不起作用?我怎样才能让我的属性名称全部大写并让 Jackson 值相同?

【问题讨论】:

    标签: kotlin jackson


    【解决方案1】:

    Kotlin 代码中 Java 注释的互操作性存在问题。你可以注册 Jackson 的 Kotlin 模块来解决这个问题:

    import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
    
    fun main() {
        val mapper = jacksonObjectMapper() // <= shortcut to ObjectMapper().registerKotlinModule()
        println(mapper.writeValueAsString(SummarizedReturn(
                BigDecimal("-194703.12028723184"),
                BigDecimal("-35"))))
    }
    

    输出:

    {"NET_CASH_FLOW":-194703.12028723184,"ROI_PERCENTAGE":-35}

    这还需要您将com.fasterxml.jackson.module:jackson-module-kotlin 添加到您的依赖项中。

    PS: 或者,您可以使用稍微不同的目标来解决它: @JsonPropery => @get:JsonPropery(或field:@JsonPropery,以防此数据类也将用于反序列化)

    【讨论】:

    • 我拉入kotlin.jacksonObjectMapper 并将其写为字符串并得到相同的结果。有什么想法吗?
    猜你喜欢
    • 2018-06-07
    • 2015-09-12
    • 1970-01-01
    • 2023-03-08
    • 2016-02-06
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多