aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/utilities
diff options
context:
space:
mode:
authorsebastian.sellmair <sebastian.sellmair@jetbrains.com>2020-07-16 10:24:02 +0200
committerSebastian Sellmair <34319766+sellmair@users.noreply.github.com>2020-07-20 12:02:45 +0200
commit13edb873db122e2088207ca10b94382e30875636 (patch)
tree44b90392faac5069848b27f6c5084dbca61607fe /core/src/main/kotlin/utilities
parente7b50c6ba2102fc9a59a460172aa7a4d82ad08df (diff)
downloaddokka-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.kt59
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)
+ }
+}