Le code est Kotlin, mais veuillez le lire comme vous le souhaitez.
Vous pouvez le faire avec jackson-dataformat-csv. https://github.com/FasterXML/jackson-dataformats-text/tree/master/csv
La documentation est assez moelleuse et ésotérique, mais vous pouvez le faire.
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)
}
}
}
Le but n'est pas de donner des informations de type à CsvSchema.
Si vous transmettez les informations de type ici, elles ne seront désérialisées qu'en fonction de l'ordre des colonnes.
@ JsonUnwrapped
est sobre et incroyable. Pratique.
Les JavaBeans sont obligatoires, donc si vous écrivez en Kotlin, abandonnez les non-null. C'est triste, n'est-ce pas.
Recommended Posts