Fastjson序列化对象成字符串时,如果对象中存在引用关系,例如一个对象的属性引用了另一个对象,那么在序列化过程中,Fastjson会使用$ref
来表示这种引用关系。这样做的目的是为了节省存储空间和提高序列化效率,因为通过引用而不是重复存储相同的数据可以大大减少序列化后的数据大小。
当Fastjson遇到一个已经序列化过的对象时,它会检查该对象是否已经在序列化过程中被引用过。如果是,则不会再次序列化该对象,而是使用$ref
来指向之前序列化过的对象。这样可以避免重复序列化相同的数据,从而提高效率。
如果想在序列化时显示原始字段而不是引用,可以通过设置SerializerFeature
来实现。
@Test
public void page() {
ProductPageReq productPageReq = new ProductPageReq();
BaseResult<PageInfoData<ProductVO>> result = productService.productPage(productPageReq);
// 输出会含有 $ref
System.out.println(JSON.toJSONString(result));
// 输出没有 $ref
System.out.println(JSON.toJSONString(result, SerializerFeature.DisableCircularReferenceDetect));
}