All Downloads are FREE. Search and download functionalities are using the official Maven repository.

.serialization_csv.1.5.4.source-code.Csv.kt Maven / Gradle / Ivy

The newest version!
package com.hexagonkt.serialization.csv

import com.fasterxml.jackson.core.JsonProcessingException
import com.fasterxml.jackson.databind.ObjectReader
import com.fasterxml.jackson.dataformat.csv.CsvGenerator
import com.fasterxml.jackson.dataformat.csv.CsvMapper
import com.fasterxml.jackson.dataformat.csv.CsvParser
import com.hexagonkt.serialization.json.JacksonHelper
import com.hexagonkt.serialization.json.JacksonHelper.setupObjectMapper
import com.hexagonkt.serialization.SerializationFormat
import java.io.InputStream
import java.io.OutputStream
import kotlin.reflect.KClass

object Csv : SerializationFormat {

    override val contentType: String = "text/csv"
    override val extensions: Set = setOf("csv")
    override val isBinary: Boolean = false

    private val mapper: CsvMapper = setupObjectMapper(
        CsvMapper()
            .configure(CsvGenerator.Feature.ALWAYS_QUOTE_EMPTY_STRINGS, false)
            .configure(CsvParser.Feature.ALLOW_TRAILING_COMMA, false)
            .configure(CsvParser.Feature.SKIP_EMPTY_LINES, true)
    ) as CsvMapper

    override fun serialize(obj: Any, output: OutputStream) {
        val schema = when (obj) {
            is Collection<*> -> mapper.schemaFor(obj.firstOrNull()?.javaClass ?: Any::class.java)
            else -> mapper.schemaFor(obj.javaClass)
        }

        mapper.writer(schema).writeValue(output, obj)
    }

    override fun  parse(input: InputStream, type: KClass): T =
        try {
            objectReader(type).readValue(input)
        }
        catch (e: JsonProcessingException) {
            throw JacksonHelper.parseException(e)
        }

    override fun  parseObjects(input: InputStream, type: KClass): List =
        try {
            objectReader(type).readValues(input).readAll()
        }
        catch (e: JsonProcessingException) {
            throw JacksonHelper.parseException(e)
        }

    private fun  objectReader(type: KClass): ObjectReader =
        mapper.readerFor(type.java).with(mapper.schemaFor(type.java))
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy