[BUG] JSONReader.Feature.SupportSmartMatch使用后会导致中相同类的解析崩溃(非常诡异)
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
### 问题描述
在使用过 JSONReader.Feature.SupportSmartMatch 后,整个应用中所有该类有关的的toJavaList都会报错,现象参考代码
### 重现步骤
```java
public static void main(String[] args) {
String s = "[{\"manager\":\"{\\\"certNo\\\":\\\"11\\\",\\\"name\\\":\\\"test\\\"}\"}]";
String upCaseS1 = "{\"MANAGER\":{\"certNo\":\"11\",\"name\":\"test\"}}";
//步骤一 正常解析
com.alibaba.fastjson2.JSONArray data1 = com.alibaba.fastjson2.JSONArray.parseArray(s);
List javaList1 = data1.toJavaList(HolderVOTest.class);
System.out.println(javaList1);
//步骤二 使用配置后
HolderVOTest holderVO1 = JSON.parseObject(upCaseS1, HolderVOTest.class, JSONReader.Feature.SupportSmartMatch);
System.out.println(holderVO1);
//步骤三,解析出错
com.alibaba.fastjson2.JSONArray data = com.alibaba.fastjson2.JSONArray.parseArray(s);
List javaList = data.toJavaList(HolderVOTest.class);
System.out.println(javaList);
}
public class HolderVOTest {
private HolderDTOTest manager;
public HolderDTOTest getManager() {
return manager;
}
public void setManager(HolderDTOTest manager) {
this.manager = manager;
}
@Override
public String toString() {
return "HolderVOTest{" +
"manager=" + manager +
'}';
}
}
public class HolderDTOTest {
private String name;
private String certNo;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCertNo() {
return certNo;
}
public void setCertNo(String certNo) {
this.certNo = certNo;
}
@Override
public String toString() {
return "HolderDTOTest{" +
"name='" + name + '\'' +
", certNo='" + certNo + '\'' +
'}';
}
```
### 期待的正确结果
可以正常解析,诡异的是整个应用的相关解析都会报错,无论是哪个线程
### 相关日志输出
[HolderVOTest{manager=HolderDTOTest{name='test', certNo='11'}}]
HolderVOTest{manager=HolderDTOTest{name='test', certNo='11'}}
Exception in thread "main" com.alibaba.fastjson2.JSONException: expect ':', but , offset 1, character ", line 1, column 1, fastjson-version 2.0.60 "{\"certNo\":\"11\",\"name\":\"test\"}"
at com.alibaba.fastjson2.JSONReaderUTF16.readFieldNameHashCode(JSONReaderUTF16.java:1417)
at com.alibaba.fastjson2.reader.ORG_2_2_HolderDTOTest.readObject(Unknown Source)
at com.alibaba.fastjson2.reader.FieldReader.acceptAny(FieldReader.java:468)
at com.alibaba.fastjson2.reader.ObjectReaderAdapter.createInstance(ObjectReaderAdapter.java:736)
at com.alibaba.fastjson2.JSONArray.toList(JSONArray.java:1203)
at com.alibaba.fastjson2.JSONArray.toJavaList(JSONArray.java:1292)
at tech.mystox.test.fastjson.HolderVOTest.main(HolderVOTest.java:34)
#### 附加信息
Contributor guide
Research direction
Reproduce the issue from HolderVOTest.main using JSONReader.Feature.SupportSmartMatch, then trace JSONArray.toJavaList through ObjectReaderAdapter, FieldReader, and JSONReaderUTF16 as shown in the stack trace. Done means the repeated toJavaList call parses successfully after the smart-match parse, without the JSONException.
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
- 48/100