data class Foo(val int: Int = 0, val bar: Bar )
data class Bar(val text: String)
fun main() {
val json = """
{
"int": 0,
"bar": {
"text" : "hello"
}
}
""".trimIndent()
val jo = JSON.parseObject(json)
val foo = jo.toJavaObject(Foo::class.java)
println(foo)
}
期待的正确结果
可以正确反序列化到目标对象。
相关日志输出
Exception in thread "main" com.alibaba.fastjson2.JSONException: invoke constructor error, public Foo(int,Bar,int,kotlin.jvm.internal.DefaultConstructorMarker)
at com.alibaba.fastjson2.reader.ConstructorFunction.apply(ConstructorFunction.java:222)
at com.alibaba.fastjson2.reader.ConstructorFunction.apply(ConstructorFunction.java:15)
at com.alibaba.fastjson2.reader.ObjectReaderNoneDefaultConstructor.createInstanceNoneDefaultConstructor(ObjectReaderNoneDefaultConstructor.java:73)
at com.alibaba.fastjson2.reader.ObjectReaderNoneDefaultConstructor.createInstance(ObjectReaderNoneDefaultConstructor.java:495)
at com.alibaba.fastjson2.JSONObject.to(JSONObject.java:1278)
at com.alibaba.fastjson2.JSONObject.toJavaObject(JSONObject.java:1297)
at MainKt.main(main.kt:19)
at MainKt.main(main.kt)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:65)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
at com.alibaba.fastjson2.reader.ConstructorFunction.apply(ConstructorFunction.java:219)
... 7 more
Caused by: java.lang.ClassCastException: Cannot cast com.alibaba.fastjson2.JSONObject to Bar
at java.base/java.lang.Class.cast(Class.java:4067)
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
... 10 more
问题描述
在使用 JSONObject.toJavaObject 反序列化 JSONObject 到带默认值的 Kotlin 类时遇到问题。 但直接使用 JSON.parseObject 没有问题。
环境信息
重现步骤
要求构造函数至少有两个参数。 构造函数中,至少含有一个带有默认值的参数。 另一个参数应该是反序列化到另一个类。
期待的正确结果
可以正确反序列化到目标对象。
相关日志输出