Gson is designed to be used with pure Java and does not interpret the basic Kotlin constructors properly.
, ( : "" someString), Gson .
Gson ( Kotlin , ).
jackson-module-kotlin, ( Kotlin, Kotlin , 2.8.x).
jackson-module-kotlin Kotson:
class SomeClass(val id: Int = -1) {
init { println("init $id") }
}
class SomeClassNoDefault(val id: Int) {
init { println("init $id") }
}
fun main(args: Array<String>) {
val mapper = jacksonObjectMapper()
val gson = Gson()
val idDefault = "{}"
val id123 = "{\"id\": 123 }"
println("jackson-module-kotlin, { }:")
val o1 = mapper.readValue<SomeClass>(idDefault)
println("after construction: ${o1.id}\n")
println("jackson-module-kotlin, { \"id\" = 123 }:")
val o2 = mapper.readValue<SomeClass>(id123)
println("after construction: ${o2.id}\n")
println("kotson, { }:")
val o3 = gson.fromJson<SomeClass>(idDefault)
println("after construction: ${o3.id}\n")
println("kotson, { \"id\" = 123 }:")
val o4 = gson.fromJson<SomeClass>(id123)
println("after construction: ${o4.id}\n")
println("---\n")
println("jackson-module-kotlin, no default value, { \"id\" = 123 }:")
val o5 = mapper.readValue<SomeClassNoDefault>(id123)
println("after construction: ${o5.id}\n")
println("kotson, no default value, { \"id\" = 123 }:")
val o6 = gson.fromJson<SomeClassNoDefault>(id123)
println("after construction: ${o6.id}\n")
}
jackson-module-kotlin, { }:
init -1
after construction: -1
jackson-module-kotlin, { "id" = 123 }:
init 123
after construction: 123
kotson, { }:
init -1
after construction: -1
kotson, { "id" = 123 }:
init -1
after construction: 123
---
jackson-module-kotlin, no default value, { "id" = 123 }:
init 123
after construction: 123
kotson, no default value, { "id" = 123 }:
after construction: 123