JacksonTextFormat.kt

  1. package com.hexagontk.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.hexagontk.serialization.SerializationFormat
  6. import com.hexagontk.serialization.jackson.JacksonHelper.createMapper
  7. import com.hexagontk.serialization.jackson.JacksonHelper.createRelaxedMapper
  8. import com.hexagontk.serialization.jackson.JacksonHelper.mapNode
  9. import java.io.InputStream
  10. import java.io.OutputStream

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

  16.     private val mapper by lazy {
  17.         if (relaxed)
  18.             createRelaxedMapper(factoryGenerator())
  19.         else
  20.             createMapper(factoryGenerator())
  21.     }

  22.     override val textFormat = true

  23.     private val writer by lazy {
  24.         if (prettyPrint)
  25.             mapper.writer(DefaultPrettyPrinter().withArrayIndenter(SYSTEM_LINEFEED_INSTANCE))
  26.         else
  27.             mapper.writer()
  28.     }

  29.     override fun serialize(instance: Any, output: OutputStream) =
  30.         writer.writeValue(output, instance)

  31.     override fun serialize(instance: Any): String =
  32.         writer.writeValueAsString(instance)

  33.     override fun parse(input: InputStream): Any =
  34.         mapNode(mapper.readTree(input))
  35. }