[QUESTION]当使用的模型中的成员变量Map有直接赋值时(比如使用LinkedHashMap),转换的json字符串无法解析为LinkedHashMap
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
### 请描述您的问题
*询问有关本项目的使用和其他方面的相关问题。*
问题描述如题,使用版本: 2.0.57
```
import com.alibaba.fastjson2.JSON;
import org.junit.Assert;
import java.util.LinkedHashMap;
import java.util.Map;
public class Test {
public static class MyPersistentData {
private Map contentMap = new LinkedHashMap<>(64);
public void setContentMap(Map contentMap) {
this.contentMap = contentMap;
}
public Map getContentMap() {
return contentMap;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyPersistentData)) return false;
MyPersistentData that = (MyPersistentData) o;
return getContentMap() != null ? getContentMap().equals(that.getContentMap()) : that.getContentMap() == null;
}
@Override
public int hashCode() {
return getContentMap() != null ? getContentMap().hashCode() : 0;
}
}
@org.junit.Test
public void test() {
MyPersistentData myPersistentData = new MyPersistentData();
Map contentMap = new LinkedHashMap<>(64);
contentMap.put("12", "12");
contentMap.put("abc", "123");
contentMap.put("bcd", "341");
myPersistentData.setContentMap(contentMap);
String json = toJSONString(myPersistentData);
MyPersistentData newMyPersistentData = parseObject(json, MyPersistentData.class);
Assert.assertNotNull(newMyPersistentData);
Assert.assertNotNull(newMyPersistentData.getContentMap());
Assert.assertTrue(newMyPersistentData.getContentMap().equals(myPersistentData.getContentMap()));
Assert.assertTrue(newMyPersistentData.equals(myPersistentData));
//这里报错了,使用的是HashMap
Assert.assertTrue(newMyPersistentData.getContentMap() instanceof LinkedHashMap);
}
public static T parseObject(String text, Class clazz) {
return JSON.parseObject(text, clazz);
}
public static String toJSONString(Object obj) {
return JSON.toJSONString(obj);
}
}
```
Contributor guide
Research direction
Start by running the Test.test reproducer and tracing JSON.parseObject(json, MyPersistentData.class) after JSON.toJSONString. Check how the contentMap Map field is instantiated during deserialization; done means the round trip preserves a LinkedHashMap, as asserted at the end of the test.
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
- Mostly clear
- Newbie friendliness
- 35/100