Fastjson 转换出现 $ref 问题解决

问题原因

实体转化为json字符串后出现了$ref字样的东西,这是因为在传输的数据中出现相同的对象

fastjson默认开启引用检测将相同的对象写成引用的形式

问题重现

import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args){
        Test t1 = new Test("测试1", "18");
        List<Test> list = new ArrayList<>();
        list.add(t1);
        list.add(t1);

        String result = JSONObject.toJSONString(list);
        System.out.println(result);
    }

    private String name;
    private String age;

    public Test(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

解决方案

在转换的时候  指定序列化方式 SerializerFeature类  常用枚举

QuoteFieldNames

 输出key时是否使用双引号,默认为true

UseSingleQuotes

使用单引号而不是双引号,默认为false

 

WriteMapNullValue

是否输出值为null的字段,默认为false

 

WriteEnumUsingToString

Enum输出name()或者original,默认为false

 

UseISO8601DateFormat

Date使用ISO8601格式输出,默认为false

 

WriteNullListAsEmpty

List字段如果为null,输出为[],而非null

 

WriteNullStringAsEmpty

字符类型字段如果为null,输出为”“,而非null

 

WriteNullNumberAsZero

数值字段如果为null,输出为0,而非null

 

WriteNullBooleanAsFalse

Boolean字段如果为null,输出为false,而非null

 

SkipTransientField

如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true

 

SortField

按字段名称排序后输出。默认为false

 

PrettyFormat

结果是否格式化,默认为false

 

WriteClassName

序列化时写入类型信息,默认为false。反序列化是需用到

 

DisableCircularReferenceDetect

消除对同一对象循环引用的问题,默认为false

 

WriteSlashAsSpecial

对斜杠’/’进行转义

 

WriteDateUseDateFormat

全局修改日期格式,默认为false。

 

DisableCheckSpecialChar

一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false

 

IgnoreNonFieldGetter

忽略非导出字段的get方法

 

使用方法  将上方main方法改为

    public static void main(String[] args){
        Test t1 = new Test("测试1", "18");
        List<Test> list = new ArrayList<>();
        list.add(t1);
        list.add(t1);

        String result = JSONObject.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect);
        System.out.println(result);
    }

在转换时 指定为 DisableCircularReferenceDetect 即可

(关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常 请谨慎使用)

猜你喜欢

转载自blog.csdn.net/weixin_40461281/article/details/108408584