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-core
、jackson-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
中的那些 _
工作得很好。
我正在尝试将一些数据 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-core
、jackson-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
中的那些 _
工作得很好。