alibaba / alibaba/fastjson2

[BUG] 在使用了JSONWriter.Feature.WriteClassName后,FastJson2无法正确处理Map<String, Integer>

Open
#3,153 6 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

### 问题描述

我有一个类
```
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

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.