-
Notifications
You must be signed in to change notification settings - Fork 501
jsonb_cn
Shaojin Wen edited this page Apr 9, 2024
·
5 revisions
fastjson2提供了一个二进制的格式 jsonb,可以提供高性能高压缩比的二进制序列化能力。jsonb是apache dubbo的缺省序列化协议,jsonb可以转换为json格式,方便诊断分析。
这种情况,序列化的结果中,将不会带类型信息,反序列化是需要指定类型。
// 序列化
Bean bean = ...;
byte[] bytes = JSONB.toBytes(bean);
// 反序列化需要指定类型
Bean parsed = JSONB.parseObject(bytes, Bean.class);
// 序列化使用Feature.WriteClassName写入类型信息
Bean bean = ...;
byte[] bytes = JSONB.toBytes(bean, JSONWriter.Feature.WriteClassName);
static final Filter autoTypeFilter = JSONReader.autoTypeFilter(
// 按需加上需要支持自动类型的类名前缀,范围越小越安全
"com.mycompany.",
"org.springframework.security.core.authority.SimpleGrantedAuthority"
);
// 反序列化
Bean parsed = (Bean) JSONB.parseObject(bytes, Object.class, autoTypeFilter);
缺省情况下,序列化JavaBean会使用KeyValue的格式映射,其中Key会占用较多空间,可以JSONWriter.Feature.BeanToArray配置使用数组的方式映射。
// 序列化是
Bean bean = ...;
byte[] bytes = JSONB.toBytes(bean, JSONWriter.Feature.BeanToArray);
// 反序列化需要指定JSONReader.Feature.SupportArrayToBean)
Bean parsed = JSONB.parseObject(bytes, Bean.class, JSONReader.Feature.SupportArrayToBean);
以下是Apache Dubbo使用的Features,供参考
// 序列化使用的Features
JSONWriter.Feature[] wirterFeatures = new JSONWriter.Feature[] {
JSONWriter.Feature.WriteClassName,
JSONWriter.Feature.FieldBased,
JSONWriter.Feature.ErrorOnNoneSerializable,
JSONWriter.Feature.ReferenceDetection,
JSONWriter.Feature.WriteNulls,
JSONWriter.Feature.NotWriteDefaultValue,
JSONWriter.Feature.NotWriteHashMapArrayListClassName
};
// 反序列化使用的Features
JSONReader.Feature[] features = new JSONReader.Feature[] {
JSONReader.Feature.UseDefaultConstructorAsPossible,
JSONReader.Feature.ErrorOnNoneSerializable,
JSONReader.Feature.IgnoreAutoTypeNotMatch,
JSONReader.Feature.UseNativeObject,
JSONReader.Feature.FieldBased
};
二进制的JSONB格式可以转成JSON,可以方便诊断问题。
Bean bean = ...;
byte[] bytes = JSONB.toBytes(bean);
String json = JSONB.toJSONString(bytes);
String json_raw = JSONB.toJSONString(bytes, true); // 直接转换,不对symbol做识别