美文网首页
FastJson重复引用 循环引用

FastJson重复引用 循环引用

作者: fengjixcuhui | 来源:发表于2018-03-20 12:10 被阅读0次

重复引用

  • 定义
    一个对象对另外一个对象
    多个字段重复引用
    集合字段重复引用.
  public class JsonTest {

   /**
    * 学生
    */
   private static class Student {

       /**
        * 姓名
        */
       private String name;

       public Student(String name) {
           this.name = name;
       }

       /**
        * Getter method for property  name.
        *
        * @return property value of name
        */
       public String getName() {
           return name;
       }

       /**
        * Setter method for property  counterType.
        *
        * @param name value to be assigned  to property <tt>name</tt>
        */
       public void setName(String name) {
           this.name = name;
       }
   }

   private static class Teacher {

       /**
        * 姓名
        */
       private String        name;

       /**
        * 学生列表
        */
       private List<Student> studentList = Lists.newArrayList();

       /**
        * 新增学生
        * @param student
        */
       public void addStudent(Student student) {
           studentList.add(student);
       }

       /**
        * Getter method for property  name.
        *
        * @return property value of name
        */
       public String getName() {
           return name;
       }

       /**
        * Setter method for property  counterType.
        *
        * @param name value to be assigned  to property <tt>name</tt>
        */
       public void setName(String name) {
           this.name = name;
       }

       /**
        * Getter method for property  studentList.
        *
        * @return property value of studentList
        */
       public List<Student> getStudentList() {
           return studentList;
       }

       /**
        * Setter method for property  counterType.
        *
        * @param studentList value to be assigned  to property <tt>studentList</tt>
        */
       public void setStudentList(List<Student> studentList) {
           this.studentList = studentList;
       }
   }

   public static void main(String[] args) {

       Teacher teacher = new Teacher();

       Student student = new Student("张三");
       teacher.addStudent(student);
       teacher.addStudent(student);
       System.out.println(JSON.toJSONString(teacher));

   }
}

结果:
{"studentList":[{"name":"张三"},{"$ref":"$.studentList[0]"}]}

循环引用

  • 定义
    对象A引用对象B, 对象B引用对象A 出现你中有,我中有你现象.
private static class Item{

        /**
         * 商品Id
         */
        private String itemId;

        /**
         * 关联订单
         */
        private Order  order;

        /**
         * Getter method for property  itemId.
         *
         * @return property value of itemId
         */
        public String getItemId() {
            return itemId;
        }

        /**
         * Setter method for property  counterType.
         *
         * @param itemId value to be assigned  to property <tt>itemId</tt>
         */
        public void setItemId(String itemId) {
            this.itemId = itemId;
        }

        /**
         * Getter method for property  order.
         *
         * @return property value of order
         */
        public Order getOrder() {
            return order;
        }

        /**
         * Setter method for property  counterType.
         *
         * @param order value to be assigned  to property <tt>order</tt>
         */
        public void setOrder(Order order) {
            this.order = order;
        }
    }


    private static class Order{

        /**
         * 订单Id
         */
        private String orderId;

        /**
         * 关联商品
         */
        private Item   item;

        /**
         * Getter method for property  orderId.
         *
         * @return property value of orderId
         */
        public String getOrderId() {
            return orderId;
        }

        /**
         * Setter method for property  counterType.
         *
         * @param orderId value to be assigned  to property <tt>orderId</tt>
         */
        public void setOrderId(String orderId) {
            this.orderId = orderId;
        }

        /**
         * Getter method for property  item.
         *
         * @return property value of item
         */
        public Item getItem() {
            return item;
        }

        /**
         * Setter method for property  counterType.
         *
         * @param item value to be assigned  to property <tt>item</tt>
         */
        public void setItem(Item item) {
            this.item = item;
        }
    }

        public static void main(String[] args) {

        Order order = new Order();

        Item item = new Item();
        item.setItemId("itemId");
        item.setOrder(order);

        order.setItem(item);
        order.setOrderId("orderId");

        System.out.println(JSON.toJSONString(item));
        System.out.println(JSON.toJSONString(order));


    }

结果:
{"itemId":"itemId","order":{"item":{"$ref":".."},"orderId":"orderId"}}
{"item":{"itemId":"itemId","order":{"$ref":".."}},"orderId":"orderId"}

解决方案

  • 避免循环引用这种情形出现.
  • 不对循环引用的字段进行序列化.
  • 编码时 使用新对象 或者 新集合 赋值,不要使用同一个对象.
  • 不要关闭FastJson 引用检测机制.如果为了避免在重复引用时显示$ref而关闭它,会有很大可能导致循环引用时发生StackOverflowError异常

相关文章

  • FastJson重复引用 循环引用

    重复引用 定义一个对象对另外一个对象多个字段重复引用集合字段重复引用. 结果:{"studentList":[{"...

  • 【JSON】解决FastJson中“$ref 循环引用”的问题

    fastjson在循环引用时对象转化成json会发生$ref: 禁用FastJson的“循环引用检测”特性。

  • FastJson循环引用导致{"$ref":"$[0]"}

    FastJson支持循环引用和重复引用,但是为了防止出现StackOverFlow异常,在一个对象被多次使用,第一...

  • FastJson重复引用问题

    问题背景 循环列表赋值 在此代码中,假如customId是同一个,userExtendEntity会取到相同的对象...

  • 4-8 循环引用

    3种循环引用 自循环引用 相互循环引用 多循环引用 Block的循环引用 NSTimer 的循环引用 破除循环引用...

  • FastJson出现{"$ref":"$[0]"}解决方案

    FastJson为了处理循环引用,而默认开启的一种措施。 1. 案例代码 1.1 案例一 多个元素持有同一个引用时...

  • 循环引用的相关问题

    1、循环引用的种类(1)自循环引用(2)相互循环引用(3)多循环引用 如何破除循环引用?(1)避免产生循环引用(2...

  • Day2

    1 单方向的引用不会产生循环引用。循环引用:闭包引用了self,self引用了闭包。Swift推荐使用解决循环引用...

  • iOS 内存管理面试题(循环引用)

    循环引用 循环引用的实质:多个对象相互之间有强引用,不能释放让系统回收。 如何解决循环引用? 1、避免产生循环引用...

  • 内存管理-循环引用

    三种类型循环引用 自循环引用 相互循环引用 多循环引用 自循环引用 假如有一个对象,内部强持有它的成员变量obj,...

网友评论

      本文标题:FastJson重复引用 循环引用

      本文链接:https://www.haomeiwen.com/subject/dbbvqftx.html