Search code examples
jsonkotlinjacksonopenapi-generatoropenapi-generator-gradle-plugin

Jackson can't deserialize some values with @get:JsonProperty


When I'm trying to deserialize code below

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,
)

I'm receiving exception:

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"])

It's failing only with @get:JsonProperty and when property name does not follow the convention (second letter is capital). But I can't change the annotation or field name because of using the open api generator plugin, it generates classes with @get:JsonProperty. I didn't find the configuration to change annotation or fieldName.

My gradle file:

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

repositories {
    mavenCentral()
}

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

I've tried to dump jackson version for openapi-generator-gradle-plugin, but it still generating fields with @get:JsonProperty


Solution

  • Adding the PropertyNamingStrategies.SNAKE_CASE and specifying com.fasterxml.jackson.core:jackson-databind in classpath with bumped version helped.

    val mapper = JsonMapper()
        .setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
        .registerKotlinModule()