fastjson2
fastjson2 copied to clipboard
[QUESTION] fastjson 2.0.39 JSONFeature.SupportAutoType标识为deprecated
请问一下,现在是不需要使用这个枚举了吗?还是说要换为其他的。 这是我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
);
}
这是个不安全的特性,现在使用 AutoTypeBeforeHandler 、JSONReader.autoTypeFilter()实现
您看这样对吗 意思是 我不需要写这个枚举了直接带进来一个 指定类名前缀的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
);
}
看起来是可以的,
com.alibaba.fastjson2.filter.ContextAutoTypeBeforeHandler#ContextAutoTypeBeforeHandler(boolean, java.lang.String...)
这里已经内置了一些类型的支持,额外的需要自己补充
好的 谢谢您