[BUG] 在使用了JSONWriter.Feature.WriteClassName后,FastJson2无法正确处理Map<String, Integer>
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
### 问题描述
我有一个类
```
public static class TestState {
Map currentTerm;
public TestState(Map currentTerm) {
this.currentTerm = currentTerm;
}
}
```
如果我在序列化时使用了`JSONWriter.Feature.WriteClassName`,那么在反序列化处理时,FastJson2在处理`currentTerm`时会报错`com.alibaba.fastjson2.JSONException: parseInt error, value : java.util.HashMap`
### 环境信息
- OS信息: Ubuntu 22.04.3 LTS
- JDK信息: Oracle JDK 1.8.0_421
- 版本信息:Fastjson2 2.0.53
### 重现步骤
可使用下列完整单元测试代码来复现该缺陷
```
import java.util.Map;
import org.junit.jupiter.api.Test;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.filter.Filter;
public class TestFastJSON {
public static class TestState {
Map currentTerm;
public TestState(Map currentTerm) {
this.currentTerm = currentTerm;
}
}
private static final Filter autoTypeFilter = JSONReader.autoTypeFilter(
"com.",
"org.",
"java.",
"edu.");
public JSONWriter.Feature[] features = new JSONWriter.Feature[] {
JSONWriter.Feature.WriteClassName,
JSONWriter.Feature.FieldBased,
};
public JSONReader.Feature[] readerFeatures = new JSONReader.Feature[] {
JSONReader.Feature.FieldBased,
};
@Test
void testFastJSON() {
Map currentTerm = new java.util.HashMap<>();
currentTerm.put("N1", 2);
currentTerm.put("N2", 2);
currentTerm.put("N3", 1);
TestState ts = new TestState(currentTerm);
String stateJSONStr = JSONObject.toJSONString(ts, features);
TestState deseriObj = JSON.parseObject(stateJSONStr, TestState.class,
autoTypeFilter,
readerFeatures);
}
}
```
将上述代码复制到任意支持Junit 5的测试框架中,运行`testFastJSON`单元测试,可观察到完整报错信息如下:
```
com.alibaba.fastjson2.JSONException: parseInt error, value : java.util.HashMap
at com.alibaba.fastjson2.JSONReader.toInt32(JSONReader.java:3050)
at com.alibaba.fastjson2.JSONReader.getInt32Value(JSONReader.java:843)
at com.alibaba.fastjson2.JSONReaderUTF16.readInt32(JSONReaderUTF16.java:2506)
at com.alibaba.fastjson2.reader.ObjectReaderImplInteger.readObject(ObjectReaderImplInteger.java:22)
at com.alibaba.fastjson2.reader.ObjectReaderImplMapTyped.readObject(ObjectReaderImplMapTyped.java:408)
at com.alibaba.fastjson2.reader.ORG_1_1_TestState.readObject(Unknown Source)
at com.alibaba.fastjson2.reader.ObjectReaderAdapter.autoType(ObjectReaderAdapter.java:247)
at com.alibaba.fastjson2.reader.ORG_1_1_TestState.readObject(Unknown Source)
at com.alibaba.fastjson2.JSON.parseObject(JSON.java:906)
at ...TestFastJSON.testFastJSON(TestFastJSON.java:48)
at java.util.ArrayList.forEach(ArrayList.java:1259)
at java.util.ArrayList.forEach(ArrayList.java:1259)
```
### 期待的正确结果
可以正确的将TestState反序列化
### 相关日志输出
如上
#### 附加信息
无
Contributor guide
Research direction
Start by running the complete JUnit 5 test in testFastJSON with Fastjson2 2.0.53 and inspect the stack path through JSONReader.java, JSONReaderUTF16.java, ObjectReaderImplInteger.java, ObjectReaderImplMapTyped.java, and ObjectReaderAdapter.java. Add regression coverage for the shown TestState and Map case; done means deserialization completes without the parseInt error.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 45/100