JacksonHelper.kt

  1. package com.hexagonkt.serialization.jackson

  2. import com.fasterxml.jackson.core.JsonFactory
  3. import com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_SINGLE_QUOTES
  4. import com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES
  5. import com.fasterxml.jackson.core.json.JsonReadFeature.*
  6. import com.fasterxml.jackson.databind.*
  7. import com.fasterxml.jackson.databind.DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
  8. import com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES
  9. import com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
  10. import com.fasterxml.jackson.databind.MapperFeature.SORT_PROPERTIES_ALPHABETICALLY
  11. import com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS
  12. import com.fasterxml.jackson.databind.json.JsonMapper
  13. import com.fasterxml.jackson.databind.node.*

  14. object JacksonHelper {

  15.     fun createObjectMapper(mapperFactory: JsonFactory): JsonMapper =
  16.         JsonMapper
  17.             .builder(mapperFactory)
  18.             .configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
  19.             .configure(FAIL_ON_EMPTY_BEANS, false)
  20.             .configure(ALLOW_UNQUOTED_FIELD_NAMES, true)
  21.             .configure(ALLOW_JAVA_COMMENTS, true)
  22.             .configure(ALLOW_SINGLE_QUOTES, true)
  23.             .configure(ALLOW_TRAILING_COMMA, true)
  24.             .configure(ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true)
  25.             .configure(ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS, true)
  26.             .configure(ALLOW_UNESCAPED_CONTROL_CHARS, true)
  27.             .configure(FAIL_ON_MISSING_CREATOR_PROPERTIES, false)
  28.             .configure(ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
  29.             .configure(SORT_PROPERTIES_ALPHABETICALLY, false)
  30.             .build()

  31.     fun nodeToCollection(node: JsonNode): Any? =
  32.         when (node) {

  33.             is ArrayNode -> node.toList().map { nodeToCollection(it) }
  34.             is ObjectNode -> {
  35.                 var map = emptyMap<String, Any?>()

  36.                 for (f in node.fields())
  37.                     map = map + (f.key to nodeToCollection(f.value))

  38.                 map
  39.             }

  40.             is TextNode -> node.textValue()
  41.             is BigIntegerNode -> node.bigIntegerValue()
  42.             is BooleanNode -> node.booleanValue()
  43.             is DecimalNode -> node.doubleValue()
  44.             is DoubleNode -> node.doubleValue()
  45.             is FloatNode -> node.floatValue()
  46.             is IntNode -> node.intValue()
  47.             is LongNode -> node.longValue()
  48.             is NullNode -> null
  49.             is BinaryNode -> node.binaryValue()

  50.             else -> error("Unknown node type: ${node::class.qualifiedName}")
  51.         }

  52.     fun mapNode(node: JsonNode): Any =
  53.         nodeToCollection(node) ?: error("Parsed content is 'null'")
  54. }