Skip to content

[BUG] 数组内嵌套HashSet,通过WriteClassName 序列化后,再反序列化会报错  #3692

@leroy-jedi

Description

@leroy-jedi

问题描述

简要描述您碰到的问题。
数组内嵌套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)

附加信息

如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixed

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions