解析json对象出现$ref: "$.list[0]"的解决办法

今天在做后台传数据到前端解析的时候遇到了这个问题。背景介绍下:后台传过去json数据是用阿里的fastjson转换的,调用的是这个方法

 

String raw = JSON.toJSONString(data);

 

后台采用SSH,传递的数据中有一对多的关系,相互引用。解析的时候发现有大量的$ref,前台解析不了。

 

循环引用:当一个对象包含另一个对象时,fastjson就会把该对象解析成引用。引用是通过$ref标示的,下面介绍一些引用的描述

  • "$ref":".." 上一级
  • "$ref":"@" 当前对象,也就是自引用
  • "$ref":"$" 根对象
  • "$ref":"$.children.0" 基于路径的引用,相当于 root.getChildren().get(0)

 

解决方法:

百度说用   JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect)

但是我这样就会stackflow

 

所以我采用:

用包装类型将对象封装一次,只保留需要的属性,对象全部过滤。

 

Layer实体类:

private String id;
    private ToplogicDiagram toplogicDiagram;
    private Building building;
    private String name;
    private Integer number;
    private Set qrOwners = new HashSet(0);
    private Set devices = new HashSet(0);
    private Set cabinets = new HashSet(0);
    private Set rooms = new HashSet(0);

 

包装类Vo:

public class LayerVo extends Layer {
    private String buildingName;  //前台需要building对象里的这个属性
    private String[] filtered=new String[]{"qrOwners","devices","cabinets","rooms","building","toplogicDiagram"};
    public String[] getFiltered() {
        return filtered;
    }
    public void setFiltered(String[] filtered) {
        this.filtered = filtered;
    }
    public LayerVo() {
        super();
    }
    public String getBuildingName() {
        return buildingName;
    }
    public void setBuildingName(String buildingName) {
        this.buildingName = buildingName;
    }
    
    

action:

layerList = layerDAOEx.findLayerByBid(keyWord);

for (Layer layer : layerList) {
                //所有的楼层属性
                LayerVo vo = new LayerVo();
                BeanTool.copyPropertiesIgnoreNull2Filtered(layer,vo, vo.getFiltered());//复制属性
                //楼宇名字属性
                vo.setBuildingName(layer.getBuilding().getName());
                listvo.add(vo);
        }

json = JSONFormat.covert2ExtjsGrid(listvo);

将Vo解析成json至前台,不会出现$ref

你可能感兴趣的:(解析json对象出现$ref: "$.list[0]"的解决办法)