Deserialisieren Sie CSV in Java basierend auf dem Headernamen

Der Code ist Kotlin, aber bitte lesen Sie ihn, wie Sie möchten.

Annahme

auskommen

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

Deserialisieren Sie CSV in Java basierend auf dem Headernamen
Lesen Sie CSV in Java (Super CSV Annotation)
Hinweise zur Signalsteuerung in Java
Java9 (basierend auf Oracle JVM) Aufholjagd
So benennen Sie Variablen in Java
[Java] Gibt eine japanische Namensdatei im Dateinamen im HTTP-Header zurück
Erstellen Sie eine TODO-App in Java 7 Create Header
Versuchen Sie, etwa 30 Zeilen in Java zu kratzen (CSV-Ausgabe)
Methodenname der Methodenkette in Java Builder + α
Laden Sie Notizen in Java auf S3 hoch und laden Sie sie herunter
Partisierung in Java
Änderungen in Java 11
Janken in Java
Ich möchte ein Objekt im CSV-Format mit mehrzeiligem Header und Filter in Java zurückgeben
Umfangsrate in Java
FizzBuzz in Java
Zusammenfassung für fortgeschrittene Benutzer basierend auf der Java-Einführungspraxis
Hinweise zur Verwendung regulärer Ausdrücke in Java