JacksonTextFormat.kt

  1. package com.hexagonkt.serialization.jackson

  2. import com.fasterxml.jackson.core.JsonFactory
  3. import com.fasterxml.jackson.core.util.DefaultIndenter.SYSTEM_LINEFEED_INSTANCE
  4. import com.fasterxml.jackson.core.util.DefaultPrettyPrinter
  5. import com.hexagonkt.serialization.SerializationFormat
  6. import com.hexagonkt.serialization.jackson.JacksonHelper.createObjectMapper
  7. import com.hexagonkt.serialization.jackson.JacksonHelper.mapNode
  8. import java.io.InputStream
  9. import java.io.OutputStream

  10. abstract class JacksonTextFormat(
  11.     factoryGenerator: () -> JsonFactory = { JsonFactory() },
  12.     prettyPrint: Boolean = true,
  13. ) : SerializationFormat {

  14.     private val mapper by lazy {
  15.         createObjectMapper(factoryGenerator())
  16.     }

  17.     override val textFormat = true

  18.     private val writer by lazy {
  19.         if (prettyPrint)
  20.             mapper.writer(DefaultPrettyPrinter().withArrayIndenter(SYSTEM_LINEFEED_INSTANCE))
  21.         else
  22.             mapper.writer()
  23.     }

  24.     override fun serialize(instance: Any, output: OutputStream) =
  25.         writer.writeValue(output, instance)

  26.     override fun serialize(instance: Any): String =
  27.         writer.writeValueAsString(instance)

  28.     override fun parse(input: InputStream): Any =
  29.         mapNode(mapper.readTree(input))
  30. }