Большинство подключаемых модулей 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
с правильной переменной. Версия для чтения карт поместила его правильно.
Что здесь происходит?