Désérialiser le CSV en Java en fonction du nom de l'en-tête

Le code est Kotlin, mais veuillez le lire comme vous le souhaitez.

supposition

s'entendre

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

Désérialiser le CSV en Java en fonction du nom de l'en-tête
Lire CSV en Java (annotation Super CSV)
Remarques sur le contrôle du signal en Java
Rattrapage Java9 (basé sur Oracle JVM)
Comment nommer des variables en Java
[Java] Renvoie un fichier de nom japonais dans le nom de fichier dans l'en-tête HTTP
Créer une application TODO dans Java 7 Créer un en-tête
Essayez de gratter environ 30 lignes en Java (sortie CSV)
Nom de méthode de la chaîne de méthodes dans Java Builder + α
Télécharger et télécharger des notes en java sur S3
Partition en Java
Changements dans Java 11
Janken à Java
Je souhaite renvoyer un objet au format CSV avec en-tête et filtre multilignes en Java
Taux circonférentiel à Java
FizzBuzz en Java
Résumé pour les utilisateurs intermédiaires basé sur la pratique d'introduction à Java
Remarques sur l'utilisation des expressions régulières en Java