java 循环引用:{“$ref“:“..“}

下面方式会出现循环依赖问题,需要注意

public class Penson {
    private String name;
    private String age;
    private Penson p;

    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; }
    public Penson getP() {return p;}
    public void setP(Penson p) { this.p = p;}
}

这样的写法 ,po.getP().setP(po);System.out.println(JSON.toJSONString(po));会出现循环依赖

   public static void main(String[] args) throws ParseException {
        Penson po = new Penson();
        po.setName("shishi");
        po.setAge("18");
        Penson poC = new Penson();
        poC.setName("baby");
        poC.setAge("1");
        po.setP(poC);
        po.getP().setP(po);
        System.out.println(JSON.toJSONString(po));
}

main方法输出:

{"age":"18","name":"shishi","p":{"age":"1","name":"baby","p":{"$ref":".."}}}

您好!您提到在使用JSON.toJSONString(disassembleActivateIdParam)时报错,错误信息是{"$ref":"$.new_product_nums[0]"}。这个错误通常是由于循环引用导致的。 在Java,JSON序列化工具通常会遇到循环引用的情况,即对象之间相互引用,导致无限递归序列化。为了解决这个问题,通常需要使用特定的配置或注解来告诉序列化工具如何处理循环引用。 您可以尝试以下几种方法来解决这个问题: 1. 使用Jackson库的@JsonIdentityInfo注解:在您的对象类上使用@JsonIdentityInfo注解,指定一个属性来标识对象的唯一性。例如: ```java @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class YourClass { // ... } ``` 这将告诉Jackson库使用对象的"id"属性来标识对象的唯一性,从而避免循环引用。 2. 使用Jackson库的@JsonManagedReference和@JsonBackReference注解:如果您的对象之间存在一对多或多对一的关系,可以使用@JsonManagedReference和@JsonBackReference注解来标识关系的所有者和反向引用。例如: ```java public class Parent { // ... @JsonManagedReference private List<Child> children; } public class Child { // ... @JsonBackReference private Parent parent; } ``` 这将告诉Jackson库在序列化时只序列化关系的所有者一侧,避免循环引用。 3. 使用Gson库的@Expose注解:如果您使用的是Gson库,可以在对象类上使用@Expose注解,并在序列化时通过excludeFieldsWithoutExposeAnnotation()方法排除未标记的字段。例如: ```java public class YourClass { @Expose private String field1; @Expose private String field2; private String field3; // ... } Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); String json = gson.toJson(disassembleActivateIdParam); ``` 这将告诉Gson库只序列化标记了@Expose注解的字段,避免序列化未标记的字段。 请根据您使用的JSON序列化库和具体情况选择适合的解决方案。希望能帮到您!如有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值