alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.79k stars 495 forks source link

[BUG]在使用 JSONObject.toJavaObject 反序列化 JSONObject 到带默认值的 Kotlin 类时遇到问题。 #3152

Open IceCream-QAQ opened 1 week ago

IceCream-QAQ commented 1 week ago

问题描述

在使用 JSONObject.toJavaObject 反序列化 JSONObject 到带默认值的 Kotlin 类时遇到问题。 但直接使用 JSON.parseObject 没有问题。

环境信息

重现步骤

要求构造函数至少有两个参数。 构造函数中,至少含有一个带有默认值的参数。 另一个参数应该是反序列化到另一个类。

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
IceCream-QAQ commented 1 week ago

报错与是否是 data class 无关。