Kotlin 数据 class 到 JSON 和 spring/jackson

Kotlin data class to JSON with spring/jackson

我正在尝试将一些数据 class 公开为 JSON 对象,但有些东西不起作用。

我有以下数据classes:

data class Link(
        @JsonProperty("rel")
        @JsonView(View.Bind::class)
        val rel: String,

        @JsonProperty("method")
        @JsonView(View.Bind::class)
        val method: HttpMethod,

        @JsonProperty("href")
        @JsonView(View.Bind::class)
        val href: String)


data class MetaData(val status: HttpStatus) {
    @JsonView(View.Bind::class)
    @JsonProperty("status_code")
    fun getStatusCode(): Int {
        return status.value()
    }

    @JsonView(View.Bind::class)
    @JsonProperty("status_desc")
    fun getStatusDesc(): String {
        return status.name
    }
}

data class Payload(
        @JsonView(View.Bind::class)
        @JsonProperty("payload")
        val payload: Any,

        @JsonProperty("_meta")
        @JsonView(View.Bind::class)
        val metaData: MetaData,

        @JsonProperty("_links")
        @JsonView(View.Bind::class)
        val links: List<Link>)

并且出于某种原因,当 Payload class 是 JAVA class 时,一切正常,但是当它是 kotlin class 时,只有 payload 元素得到进入 JSON.

我正在使用的依赖项:

<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-stdlib</artifactId>
    <version>1.0.1-1</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
    <version>2.7.1-2</version>
</dependency>

如果我将“_meta”和“_links”更改为 "meta" 和 "links",则会呈现 "links" 元素。

根据您提供的信息,问题似乎在于将 _ 用作 JsonProperty value。您可能已经观察到 MetaData 的所有属性都包含 _。尝试删除所有下划线并查看。我也希望您已经在 Application class:

中注册了 ObjectMapper, 示例
@Bean
open fun objectMapperBuilder(): Jackson2ObjectMapperBuilder
        = Jackson2ObjectMapperBuilder().modulesToInstall(KotlinModule())

我必须使用以下依赖项组合

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.7.3</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.7.3</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.3</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
        <version>2.7.3</version>
    </dependency>

从 2.7.1-2 到 2.7.3 的更新形式 jackson-module-kotlin 在问题上几乎没有差异,但我有义务包括 jackson-corejackson-annotations , 和 jackson-databind

显然 jackson-module-kotlin 中包含的 jackson jar 有一些问题 spring-webmvc 阻止我注册 kotlin 模块,如下所示

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="kotlinMapper" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<bean id="kotlinMapper"
      class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">

    <property name="featuresToEnable">
        <array>
            <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT" />
            <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_EMPTY_JSON_ARRAYS" />
        </array>
    </property>

    <property name="modulesToInstall" value="com.fasterxml.jackson.module.kotlin.KotlinModule" />
</bean>

最终 @JsonProperty 中的那些 _ 工作得很好。