Skip to content

Instantly share code, notes, and snippets.

@bastman
Created November 3, 2016 12:00
Show Gist options
  • Save bastman/0be4a689ffc2a61969108c6ff7cf93fa to your computer and use it in GitHub Desktop.
Save bastman/0be4a689ffc2a61969108c6ff7cf93fa to your computer and use it in GitHub Desktop.
Json Encoder/Decoder for kotlin-lang (wraps jackson)
package com.seb.util
import com.fasterxml.jackson.core.type.TypeReference
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import java.util.HashMap
object JsonUtil {
fun jackson():ObjectMapper {
return jacksonObjectMapper()
}
fun jacksonEncode(data:Any):String {
val mapper= jacksonObjectMapper()
return mapper.writeValueAsString(data)
}
inline fun <reified T> jacksonDecode(json: String): T {
return jacksonObjectMapper()
.readValue(json, object : TypeReference<T>(){})
}
fun <T>jacksonDecode(json:String, valueType: Class<T>):T {
val mapper= jacksonObjectMapper()
return mapper.readValue(json, valueType)
}
fun encode(data:Any):String {
return jacksonEncode(data)
}
fun decode(json:String):Any {
val mapper= jacksonObjectMapper()
if (json.trim() == "null") {
return Unit
}
arrayListOf(
{ txt: String -> mapper.readValue(txt, HashMap::class.java) },
{ txt: String -> mapper.readValue(txt, List::class.java) },
{ txt: String -> mapper.readValue(txt, Number::class.java) },
{ txt: String -> mapper.readValue(txt, Boolean::class.java) },
{ txt: String -> mapper.readValue(txt, String::class.java) }
).forEach {
try {
return it.invoke(json)
} catch (all: Throwable) {
}
}
throw RuntimeException("Failed to decode json")
}
}
data class MyData(val a: String, val b: Int)
fun main(args: Array<String>) {
val jsonStr = """
{"a": "value1", "b": 1}
"""
val d1:MyData =JsonUtil.jacksonDecode(jsonStr, MyData::class.java)
val d1:MyData =JsonUtil.jacksonDecode(jsonStr)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment