问题描述
简要描述您碰到的问题。
数组内嵌套HashSet,通过WriteClassName 序列化后,再反序列化会报错
环境信息
- OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB]
- JDK信息: [e.g.:Openjdk 1.8.0_312]
- 版本信息:[e.g.:Fastjson2 2.0.57]
重现步骤
当 添加 Feature.NotWriteSetClassName 属性时,可以正常返序列化,当HashSet对象会被解析成JSONArray, 违背了传递WriteClassName 、autoType的初衷。
public void testInfo() {
HashSet<String> list = new HashSet<>();
list.add("test1");
list.add("test2");
list.add("test3");
// HashMap<String, Object> autoSettingMap = new HashMap<>();
// autoSettingMap.put("list", list);
Object[] data = new Object[]{list};
String jsonString = JSONUtil.encode(data);
Print.print("JSON String: " + jsonString);
Object list1 = JSONUtil.decode(jsonString, Object[].class);
Print.printJSONString("Decoded List: " + list1);
}
public static <T> T decode(String s, Type type) {
s = JediStrUtil.isEmpty(s) ? null : s;
return JSON.parseObject(s, type
, autoTypeBeforeHandler
, JSONReader.Feature.FieldBased
, JSONReader.Feature.IgnoreAutoTypeNotMatch
, JSONReader.Feature.UseNativeObject
);
}
public static String encode(Object object) {
// 要避免String类型 再次被包装
if (object instanceof String) {
return (String) object;
}
return JSONObject.toJSONString(object
, Feature.WriteClassName
, Feature.IgnoreErrorGetter
, Feature.FieldBased
, Feature.ReferenceDetection
);
}
期待的正确结果
正确解析成HashSet。
或者WriteFeature提供一个选项,统一用@type来处理,JDK中自带的包装类型。
相关日志输出
JSON String: {"@type":"[O","@value":[Set["test2","test3","test1"]]}
com.alibaba.fastjson2.JSONException: offset 25, character S, line 1, column 25, fastjson-version 2.0.58 {"@type":"[O","@value":[Set["test2","test3","test1"]]}
at com.alibaba.fastjson2.reader.ObjectArrayReader.readObject(ObjectArrayReader.java:89)
at com.alibaba.fastjson2.reader.ObjectArrayReader.readObject(ObjectArrayReader.java:112)
at com.alibaba.fastjson2.JSON.parseObject(JSON.java:906)
at com.jedi.framework.utils.JSONUtil.decode(JSONUtil.java:182)
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。
问题描述
简要描述您碰到的问题。
数组内嵌套HashSet,通过WriteClassName 序列化后,再反序列化会报错
环境信息
重现步骤
当 添加 Feature.NotWriteSetClassName 属性时,可以正常返序列化,当HashSet对象会被解析成JSONArray, 违背了传递WriteClassName 、autoType的初衷。
期待的正确结果
正确解析成HashSet。
或者WriteFeature提供一个选项,统一用@type来处理,JDK中自带的包装类型。
相关日志输出
JSON String: {"@type":"[O","@value":[Set["test2","test3","test1"]]}
com.alibaba.fastjson2.JSONException: offset 25, character S, line 1, column 25, fastjson-version 2.0.58 {"@type":"[O","@value":[Set["test2","test3","test1"]]}
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。