Der Code ist Kotlin, aber bitte lesen Sie ihn, wie Sie möchten.
Sie können dies mit jackson-dataformat-csv tun. https://github.com/FasterXML/jackson-dataformats-text/tree/master/csv
Die Dokumentation ist ziemlich flauschig und esoterisch, aber Sie können es tun.
import assertk.assert
import assertk.assertions.isEqualTo
import assertk.assertions.isNotNull
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.annotation.JsonUnwrapped
import com.fasterxml.jackson.dataformat.csv.CsvMapper
import com.fasterxml.jackson.dataformat.csv.CsvSchema
import org.junit.Test
class DeserializeTest {
enum class Country {
JP,
US
}
class Profile {
@JsonProperty("age")
val age: Int = 0
@JsonProperty("country")
val country: Country = Country.JP
}
class User {
@JsonProperty("_id")
val id: Int = 0
@JsonProperty("name")
val name: String = ""
@JsonUnwrapped(prefix = "profile.")
val profile: Profile? = null
}
@Test
fun deserialize() {
val mapper = CsvMapper()
val schema = CsvSchema.emptySchema().withHeader()
val reader = mapper.readerFor(User::class.java).with(schema)
val users = reader.readValues<User>("""
name,_id,profile.age,profile.country
foo,3,17,JP
bar,2,21,US
""".trim()).readAll()
assert(users[0].id).isEqualTo(3)
assert(users[0].name).isEqualTo("foo")
assert(users[0].profile).isNotNull {
assert(it.actual.age).isEqualTo(17)
assert(it.actual.country).isEqualTo(Country.JP)
}
assert(users[1].id).isEqualTo(2)
assert(users[1].name).isEqualTo("bar")
assert(users[1].profile).isNotNull {
assert(it.actual.age).isEqualTo(21)
assert(it.actual.country).isEqualTo(Country.US)
}
}
}
Es geht nicht darum, CsvSchema Typinformationen zu geben.
Wenn Sie die Typinformationen hier übergeben, werden sie nur basierend auf der Spaltenreihenfolge deserialisiert.
@ JsonUnwrapped
ist nüchtern und erstaunlich. Praktisch.
JavaBeans sind erforderlich. Wenn Sie also in Kotlin schreiben, geben Sie Nicht-Null auf. Es ist traurig, nicht wahr?
Recommended Posts