FastJson中迴圈引用的問題

JAVA中的柴犬發表於2018-06-15
問題場景
在公司程式碼中要傳一個複合物件的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);
                    }
                }
            }

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

相關文章