[BUG]在使用 JSONObject.toJavaObject 反序列化 JSONObject 到带默认值的 Kotlin 类时遇到问题。
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
### 问题描述
在使用 JSONObject.toJavaObject 反序列化 JSONObject 到带默认值的 Kotlin 类时遇到问题。
但直接使用 JSON.parseObject 没有问题。
### 环境信息
- OS信息: macOS 15.1
- JDK信息:Openjdk 21
- 版本信息:Fastjson2 2.0.53
### 重现步骤
要求构造函数至少有两个参数。
构造函数中,至少含有一个带有默认值的参数。
另一个参数应该是反序列化到另一个类。
```Kotlin
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
```
Contributor guide
Research direction
Start with the failing Kotlin reproduction and compare JSONObject.toJavaObject with the working JSON.parseObject path. Read ConstructorFunction.java, ObjectReaderNoneDefaultConstructor.java, and JSONObject.java around the stack-trace entries, then add a regression test showing that Foo with its nested Bar deserializes successfully and run the relevant test suite.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, kotlin
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 35/100