Как сделать Kotlin Jackson CSV reader отображать имена столбцов в POJO? - PullRequest
0 голосов
/ 05 августа 2020

Большинство подключаемых модулей Jackson могут без проблем сопоставляться с разными именами или именами, отличными от порядка, но мне не удается заставить jackson-dataformat-csv это сделать. Он игнорирует любые @JsonProperty и вместо этого, кажется, заполняется на основе порядка появления членов POJO во время компиляции. Если я сначала прочитаю CSV в List<Map<String, String>>, я могу без проблем преобразовать его в POJO. Мне не хватает флага или что-то в этом роде?

Тривиальный пример kotlin (обратите внимание, что порядок CSV намеренно отличается от порядка POJO):

class JacksonCSVTest {

    val sampleCsv = """
        A,c,BAD_HEADER BAD
        1,3,2
    """.trimIndent()

    class Foo {
        @JsonProperty("A")
        var a: Int = 0
        @JsonProperty("BAD_HEADER BAD")
        var b: Int = 0
        var c: Int = 0

        override fun toString(): String = "Foo(a=$a, b=$b, c=$c)"
    }

   @Test
    fun testDirectReader() {
        val csvMapper = CsvMapper()
        val schema = csvMapper.schemaFor(Foo::class.java).withHeader()
        val foos = csvMapper.readerFor(Foo::class.java).with(schema).readValues<Foo>(sampleCsv).readAll()
        val foo = csvMapper.convertValue(foos.single(), Foo::class.java)
        println(foo)
    }

    @Test
    fun testMapReader() {
        val csvMapper = CsvMapper()
        val schema = CsvSchema.emptySchema().withHeader()
        val map = csvMapper
            .readerFor(HashMap::class.java)
            .with(schema)
            .readValues<HashMap<String, String>>(sampleCsv)
            .readAll()
        val foo = csvMapper.convertValue(map.single(), Foo::class.java)
        println(foo)
    }
}

приводит к:

Foo(a=1, b=3, c=2)
 > testDirectReader (0.19s)
Foo(a=1, b=2, c=3)
 > testMapReader (0.01s)

Версия для прямого считывания не поместила столбец BAD_HEADER BAD с правильной переменной. Версия для чтения карт поместила его правильно.

Что здесь происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...