fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[QUESTION] fastjson 2.0.39 JSONFeature.SupportAutoType标识为deprecated

Open qingcaoDE opened this issue 1 year ago • 4 comments

请问一下,现在是不需要使用这个枚举了吗?还是说要换为其他的。 这是我json2序列化的 读写代码

@Override
public byte[] serialize(T t) throws SerializationException {
	if (t == null) {
		return new byte[0];
	}
	return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName,
					JSONWriter.Feature.FieldBased,
					JSONWriter.Feature.WriteBigDecimalAsPlain,
					JSONWriter.Feature.WriteNameAsSymbol,
					JSONWriter.Feature.WriteLongAsString,
					JSONWriter.Feature.LargeObject
			)
			.getBytes(DEFAULT_CHARSET);
}

@Override
public T deserialize(byte[] bytes) throws SerializationException {
	if (bytes == null || bytes.length <= 0) {
		return null;
	}
	String str = new String(bytes, DEFAULT_CHARSET);
	return JSON.parseObject(str, clazz, autoTypeFilter,
			JSONReader.Feature.FieldBased,
			JSONReader.Feature.SupportAutoType
	);
}

qingcaoDE avatar Jan 12 '24 03:01 qingcaoDE

这是个不安全的特性,现在使用 AutoTypeBeforeHandler 、JSONReader.autoTypeFilter()实现

rowstop avatar Jan 12 '24 05:01 rowstop

您看这样对吗 意思是 我不需要写这个枚举了直接带进来一个 指定类名前缀的autoTypeFilter就可以实现了吗

//当打开AutoTypeSupport,
// 虽然内置了一个比较广泛的黑名单,但仍然是不够安全的。
// 下面有一种办法是控制当前调用的AutoType支持范围,避免全局打开,这个更安全。
static final Filter autoTypeFilter = JSONReader.autoTypeFilter(
		// 按需加上需要支持自动类型的类名前缀,范围越小越安全
		"com.xxx"
);


@Override
public T deserialize(byte[] bytes) throws SerializationException {
	if (bytes == null || bytes.length <= 0) {
		return null;
	}
	String str = new String(bytes, DEFAULT_CHARSET);
	return JSON.parseObject(str, clazz, autoTypeFilter,
			JSONReader.Feature.FieldBased
	);
}

qingcaoDE avatar Jan 12 '24 06:01 qingcaoDE

看起来是可以的, com.alibaba.fastjson2.filter.ContextAutoTypeBeforeHandler#ContextAutoTypeBeforeHandler(boolean, java.lang.String...) 这里已经内置了一些类型的支持,额外的需要自己补充

rowstop avatar Jan 12 '24 06:01 rowstop

好的 谢谢您

qingcaoDE avatar Jan 12 '24 07:01 qingcaoDE