如何使Kotlin Jackson CSV阅读器将列名映射到POJO?
大多数Jackson插件可以毫无问题地映射到不同的或无序的名称,但我在获取如何使Kotlin Jackson CSV阅读器将列名映射到POJO?,csv,kotlin,jackson,Csv,Kotlin,Jackson,大多数Jackson插件可以毫无问题地映射到不同的或无序的名称,但我在获取Jackson dataformat csv时遇到了麻烦。它忽略任何@JsonProperty,而是根据POJO成员在编译时的出现顺序进行填充。如果我先将CSV读入列表,然后就可以将其转换为POJO而不会出现任何问题。我是不是少了一面旗帜 琐碎的kotlin示例(请注意,CSV顺序有意不同于POJO顺序): 直接读卡器版本未使用正确的变量放置列BAD\u HEADER BAD。 地图阅读器版本将其正确放置 这里发生了什么?
Jackson dataformat csv
时遇到了麻烦。它忽略任何@JsonProperty
,而是根据POJO成员在编译时的出现顺序进行填充。如果我先将CSV读入列表
,然后就可以将其转换为POJO而不会出现任何问题。我是不是少了一面旗帜
琐碎的kotlin示例(请注意,CSV顺序有意不同于POJO顺序):
直接读卡器版本未使用正确的变量放置列BAD\u HEADER BAD
。
地图阅读器版本将其正确放置
这里发生了什么?我不知道这个jackson的bug,在解析CSV时我也遇到了一些问题
如果您仍然希望这样做,我创建了自己的CSV库,名为,因为在使用Jackson的CSV解析器时遇到了太多问题…我不知道Jackson的错误,在解析CSV时我也遇到了一些问题 如果您仍然希望这样做,我创建了自己的CSV库,名为,因为Jackson的CSV解析器存在太多问题
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)