Skip to content

jsonb_cn

Shaojin Wen edited this page Apr 9, 2024 · 5 revisions

fastjson2提供了一个二进制的格式 jsonb,可以提供高性能高压缩比的二进制序列化能力。jsonb是apache dubbo的缺省序列化协议,jsonb可以转换为json格式,方便诊断分析。

1. 需要自定类型的JavaBean序列化和反序列化

这种情况,序列化的结果中,将不会带类型信息,反序列化是需要指定类型。

// 序列化
Bean bean = ...;
byte[] bytes = JSONB.toBytes(bean); 

// 反序列化需要指定类型
Bean parsed = JSONB.parseObject(bytes, Bean.class);

2. 自动类型的JavaBean序列化和反序列化

// 序列化使用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);

3. 将JavaBean用数组的方式做映射序列化和反序列化

缺省情况下,序列化JavaBean会使用KeyValue的格式映射,其中Key会占用较多空间,可以JSONWriter.Feature.BeanToArray配置使用数组的方式映射。

// 序列化是
Bean bean = ...;
byte[] bytes = JSONB.toBytes(beanJSONWriter.Feature.BeanToArray); 

// 反序列化需要指定JSONReader.Feature.SupportArrayToBean)
Bean parsed = JSONB.parseObject(bytes, Bean.class, JSONReader.Feature.SupportArrayToBean);

4. 推荐使用Feature

以下是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	
};

5. 将JSONB bytes转成JSON格式

二进制的JSONB格式可以转成JSON,可以方便诊断问题。

Bean bean = ...;
byte[] bytes = JSONB.toBytes(bean); 

String json = JSONB.toJSONString(bytes);
String json_raw = JSONB.toJSONString(bytes, true); // 直接转换,不对symbol做识别