使用@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
相关产品推荐
相关产品推荐

