diff options
author | sebastian.sellmair <sebastian.sellmair@jetbrains.com> | 2020-07-16 10:24:02 +0200 |
---|---|---|
committer | Sebastian Sellmair <34319766+sellmair@users.noreply.github.com> | 2020-07-20 12:02:45 +0200 |
commit | 13edb873db122e2088207ca10b94382e30875636 (patch) | |
tree | 44b90392faac5069848b27f6c5084dbca61607fe /core/src/main/kotlin/utilities | |
parent | e7b50c6ba2102fc9a59a460172aa7a4d82ad08df (diff) | |
download | dokka-13edb873db122e2088207ca10b94382e30875636.tar.gz dokka-13edb873db122e2088207ca10b94382e30875636.tar.bz2 dokka-13edb873db122e2088207ca10b94382e30875636.zip |
Use jackson for json serialization and parsing
Diffstat (limited to 'core/src/main/kotlin/utilities')
-rw-r--r-- | core/src/main/kotlin/utilities/json.kt | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/core/src/main/kotlin/utilities/json.kt b/core/src/main/kotlin/utilities/json.kt new file mode 100644 index 00000000..d2e70d75 --- /dev/null +++ b/core/src/main/kotlin/utilities/json.kt @@ -0,0 +1,59 @@ +package org.jetbrains.dokka.utilities + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.* +import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.jacksonTypeRef +import java.io.File +import java.lang.reflect.Type +import com.fasterxml.jackson.core.type.TypeReference as JacksonTypeReference + +private val objectMapper = run { + val module = SimpleModule().apply { + addSerializer(FileSerializer) + } + jacksonObjectMapper() + .registerModule(module) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) +} + +@PublishedApi +internal class TypeReference<T> private constructor( + internal val jackson: JacksonTypeReference<T> +) { + companion object { + @OptIn(ExperimentalStdlibApi::class) + internal inline operator fun <reified T> invoke(): TypeReference<T> = TypeReference(jacksonTypeRef()) + } +} + +@PublishedApi +internal fun toJsonString(value: Any): String = objectMapper.writeValueAsString(value) + +@PublishedApi +internal inline fun <reified T : Any> parseJson(json: String): T { + return parseJson(json, TypeReference()) +} + +@PublishedApi +internal fun <T : Any> parseJson(json: String, typeReference: TypeReference<T>): T { + return objectMapper.readValue(json, typeReference.jackson) +} + +private object FileSerializer : StdScalarSerializer<File>(File::class.java) { + override fun serialize(value: File, g: JsonGenerator, provider: SerializerProvider) { + g.writeString(value.path) + } + + override fun getSchema(provider: SerializerProvider, typeHint: Type): JsonNode { + return createSchemaNode("string", true) + } + + @Throws(JsonMappingException::class) + override fun acceptJsonFormatVisitor(visitor: JsonFormatVisitorWrapper, typeHint: JavaType) { + visitStringFormat(visitor, typeHint) + } +} |