【问题标题】:Kotlin data class to JSON with spring/jackson使用 spring/jackson 将 Kotlin 数据类转换为 JSON
【发布时间】:2016-03-29 19:35:29
【问题描述】:

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

我有以下数据类:

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 类是 JAVA 类时,一切正常,但当它是 kotlin 类时,只有有效负载元素进入 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”元素。

【问题讨论】:

    标签: json spring-mvc jackson kotlin data-class


    【解决方案1】:

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

    @Bean
    open fun objectMapperBuilder(): Jackson2ObjectMapperBuilder
            = Jackson2ObjectMapperBuilder().modulesToInstall(KotlinModule())
    

    【讨论】:

      【解决方案2】:

      我不得不使用以下依赖组合

          <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-annotationsjackson-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 中的_ 工作得很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-19
        • 2019-01-06
        • 2015-06-03
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多