You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@get:JsonProperty时Jackson反序列化部分值失败求助

Jackson Kotlin模块反序列化@get:JsonProperty字段异常解决方案

问题背景

使用Jackson Kotlin模块进行JSON反序列化时,遇到以下异常场景:

  • 数据类字段使用@get:JsonProperty注解,且字段名不符合常规驼峰规则(如第二个字母大写的vString4)
  • 抛出UnrecognizedPropertyException,提示无法识别JSON中下划线命名的对应字段(如v_string4)
  • 改用@JsonProperty或@field:JsonProperty注解的字段可正常反序列化

项目依赖OpenAPI生成器自动生成实体类,生成的类默认使用@get:JsonProperty注解,无法修改注解或字段名,调整Jackson版本后问题仍存在。

复现代码

import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper

fun main() {
    val objectMapper = jacksonObjectMapper()

    val jsonString = "{" +
            "\"v_string1\": \"some_string1\", " +
            "\"v_string2\": \"some_string2\", " +
            "\"v_string3\": \"some_string3\", " +
            "\"v_string4\": \"some_string4\"" +
            "}"

    val result = objectMapper.readValue(jsonString, TestProps::class.java)
    println(result)
}

data class TestProps (
    @JsonProperty("v_string1")
    val vString1: String? = null,

    @field:JsonProperty("v_string2")
    val vString2: String? = null,

    @get:JsonProperty("v_string3")
    val vvString3: String? = null,

    @get:JsonProperty("v_string4")
    val vString4: String? = null,
)

异常信息

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "v_string4" (class auto.atom.TestProps), not marked as ignorable (4 known properties: "v_string2", "v_string3", "vString4", "v_string1"])

项目Gradle配置

plugins {
    kotlin("jvm") version "2.0.10"
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.18.1")
}

有效解决方案

1. 配置ObjectMapper禁用Getter作为Setter的逻辑

修改jacksonObjectMapper的配置,强制指定命名策略为蛇形命名,同时禁用Jackson通过Getter方法推导字段名的行为:

import com.fasterxml.jackson.databind.MapperFeature
import com.fasterxml.jackson.databind.PropertyNamingStrategies

fun main() {
    val objectMapper = jacksonObjectMapper()
        .setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
        .configure(MapperFeature.USE_GETTERS_AS_SETTERS, false)

    val jsonString = "{" +
            "\"v_string1\": \"some_string1\", " +
            "\"v_string2\": \"some_string2\", " +
            "\"v_string3\": \"some_string3\", " +
            "\"v_string4\": \"some_string4\"" +
            "}"

    val result = objectMapper.readValue(jsonString, TestProps::class.java)
    println(result)
}

原理:USE_GETTERS_AS_SETTERS设为false后,Jackson会直接使用@get:JsonProperty注解指定的名称匹配JSON字段,而非通过Getter方法名反向推导字段名,避免了非常规驼峰命名导致的匹配失败。

2. Spring环境全局配置ObjectMapper

如果是Spring项目,可通过配置类全局生效:

import com.fasterxml.jackson.databind.MapperFeature
import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class JacksonConfig {
    @Bean
    fun objectMapper() = jacksonObjectMapper()
        .setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
        .configure(MapperFeature.USE_GETTERS_AS_SETTERS, false)
}

3. 调整OpenAPI生成器注解目标(可选)

若允许修改OpenAPI生成器配置,可指定生成@field:JsonProperty注解替代@get:JsonProperty,从根源避免问题。在OpenAPI生成器的配置文件(如generatorConfig.yaml)中添加:

generatorName: kotlin
configOptions:
  annotationLibrary: jackson
  jacksonPropertyAnnotationTarget: FIELD

内容的提问来源于stack exchange,提问作者Victor Kravchenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:17:14