alibaba / alibaba/fastjson2

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

Open
#3,152 5 comments 0 reactions 0 assignees View on GitHub
bug
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.