1. 程式人生 > >FastJson中迴圈引用的問題

FastJson中迴圈引用的問題

問題場景
在公司程式碼中要傳一個複合物件的list集合。在複合物件中的結構是,一個物件引用了另外一個物件。這時候,在Fastjson轉化為json字串的時候出現了問題,原始碼改過了,所以這裡描述一下。有A類,下A類中引用了B類。在A類查詢都B的id,然後根據B的id再次在資料庫中進行查詢。因為測試服中A中的所有ID都是相同的,所以導致查詢出來的B的結果是一樣的。其中的程式碼如下。
if (invoices.getCompanyId() !=null) {
        EnterpriseCompany enterpriseCompany = new EnterpriseCompany();
        enterpriseCompany = enterpriseCompanyMapper.selectByPrimaryKey(invoices.getCompanyId());
        list.add(enterpriseCompany);
    }
在這樣的情景下,fastJson會正確解析list中的第一個物件,如果A中引用的值和第一個相同的時候,就會出現問題,具體的內容就不能重現了。
會出現$ref的情況
“$ref”:”..” 上一級
“$ref”:”@” 當前物件,也就是自引用
“$ref”:”$” 根物件
“$ref”:”$.children.0” 基於路徑的引用,相當於root.getChildren().get(0)
解決方案一
JSON.toJSONString(imList,SerializerFeature.DisableCircularReferenceDetect);
解決方案二
在程式碼中拒絕使用複雜物件,在程式碼中使用List
<Map>這樣的結構去組裝資料,這樣我感覺才是正確的開啟方式。
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
List<Map<String, Object>> listCompanys = enterpriseCompanyMapper.selectByParam(map);
            if (listCompanys.size() ==1) {
                Integer id = (Integer) listCompanys.get(0
).get("id"); String name = (String) listCompanys.get(0).get("name"); map.put("companyId",id); List<EnterpriseAccountInvoices> invoicesList =enterpriseAccountInvoicesMapper.getInvoicesListByPage(map); if (invoicesList.size() > 0) { for (EnterpriseAccountInvoices invoices : invoicesList) { Map<String,Object> objectMap =new HashMap<String, Object>(0); invoices.setDoubleInvoiceMoney(df.format(invoices.getInvoiceMoney() / 100.00)); invoices.setDoubleTaxesMoney(df.format(invoices.getTaxesMoney() / 100.00)); invoices.setTotalMoney(df.format((invoices.getInvoiceMoney() + invoices.getTaxesMoney()) / 100.00)); objectMap.put("invoices",invoices); objectMap.put("companyName",name); list.add(objectMap); } } }

這樣的話,想怎麼封裝資料就封裝資料。