alibaba / alibaba/fastjson2

[QUESTION]当使用的模型中的成员变量Map有直接赋值时(比如使用LinkedHashMap),转换的json字符串无法解析为LinkedHashMap

Open
#3,483 0 comments 0 reactions 0 assignees View on GitHub
question
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

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.