1. 程式人生 > >Java實體類轉Json出現的一些問題

Java實體類轉Json出現的一些問題

net.sf.json.JSONException: There is a cycle in the hierarchy! 這個問題說明,實體類物件包含另外一個實體類的物件,並且形成了迴圈引用。解決這個問題的方法可以通過設定jsonconfig來避免: JsonConfig jsonConfig = new JsonConfig(); 
jsonConfig.setJsonPropertyFilter(new PropertyFilter() { 
    public boolean apply(Object obj, String name, Object value) { 
        if(value instanceof Set<?> || value instanceof TGGoodsEvaluate){          //這裡是通過類名來過濾
            return true; 
        }else{ 
            return false; 
        } 
    } 
}); jsonConfig.setExcludes(new String[]{"addTime"});     //也可以通過變數名來過濾 net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
相比上一個問題,這個問題更加隱晦一點,從棧資訊裡面看不到具體原因,通常有以下幾個問題:
1、JSONArray array = JSONArray.fromObject(this.users.toArray());      //如果要轉為json陣列,那麼需要將List先轉為陣列,然後再去進行json轉換 2、因為bean裡有Date欄位,且從資料庫裡讀出來的是java.sql.Date賦值給了java.util.Date,轉化成JSONArray時出錯;可以在從資料庫讀出Date 時直接寫成:new java.util.Date(rs.getDate("date").getTime),這樣就不會出錯了;
如果是Hibernate生成的類,好像沒遇到這種情況,如果遇到可以嘗試以下方法:

json-lib有一個配置類JsonConfig
通過JsonConfig可以註冊一個欄位處理器
實現JsonValueProcessor介面即可

JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.util.Date.class,new JsonValueProcessor() {
  private SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd"
); public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) { return value == null ?"" : sd.format(value); } public Object processArrayValue(Object value, JsonConfig jsonConfig) { return null; } });

所以你最後應該把JsonConfig物件傳入json操作方法

printWriter.write(JSONArray.fromObject(dutyList,jsonConfig).toString());
3、hibernate延時載入
這個問題也是被坑的最久的一個問題,主要是由於實體類還包含了另外一個實體類,並且出現了延遲載入導致的。當時錯誤棧資訊也一直沒有顯示出這個錯誤,直到經測試發現,如果把內層包含的實體類new出來,在加到外層實體類裡面,再去轉json,可以正常進行,這才想到可能是延遲載入的問題,於是網上搜了一下得到以下解決方案:
JsonConfig cfg = new JsonConfig();
cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
最後在轉json的時候把jsonconfig當做一個引數傳入即可。

相關推薦

Java實體Json出現一些問題

net.sf.json.JSONException: There is a cycle in the hierarchy! 這個問題說明,實體類物件包含另外一個實體類的物件,並且形成了迴圈引用。解決這個問題的方法可以通過設定jsonconfig來避免: JsonCon

學習筆記 利用反射 手寫一個簡單的實體 json 的方法

不得不說 反射真的是個好動  # 貼上我的程式碼   package com.lengff.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetExce

.net 中 Json資料實體實體Json

1.獲取一個頁面的json值,轉換為實體類 public static void GetPurchaseMatPriceLogList()         {             HttpWebRequest request = (HttpWebRequest)Http

json字串java實體

本文參考自大神部落格:點選開啟連結 一、json強轉實體類 1.實體類 package test; public class PassPortForLendsEntity { private String passportid; private

帶有java.util.Date型別的實體json物件

有時專案中會遇到這樣的場景: 實體類需要轉換成json,然後傳給前臺或者其他專案裡,如果實體類裡包含java.util.Date型別的屬性,轉換後,會變成這樣(如果沒做任何處理) "receiveTime": { "

JSON字串Java實體POJO工具

網址:http://www.bejson.com/json2javapojo/ 選擇JSON相關—>JSON生成Java實體類,在編輯框內輸入JSON內容 { “status”:1,

json字串java實體及屬性對應中的貓膩詳解

一、json強轉實體類 1.實體類 package test; public class PassPortForLendsEntity { private String passportid;

java 實體 list 怎麼map

這是service層的 @Override     @Transactional     public PageVo<List<Map<String,Object>>> searchOrders(UserVo user,         

實體接收json資料與java關鍵字重名問題

        在做切換harbor需求的時候,因為新老harbor的漏洞掃描格式不同,老harbor中有對於單個映象不同漏洞等級等的統計資訊,而新harbor中只有漏洞詳情,想來這也好辦,直接統計各個

json通過實體轉換時出現的異常

1、空值轉換-異常情況: [html] view plain copy Can not instantiate value of type [map type; class java.util.HashMap, [simple type, class jav

使用Java註解將實體化為sql字串

首先是定義一個實體類,如下 /* * 定義使用者,通過註解對映到資料庫 */ @Table("user") public class User { @Column("id") private int id; @Column("username") privat

【XML】將String格式的XML檔案化成JAVA實體

1.問題: 如何將String型別的XML轉化成JAVA實體類? 2.原始碼: public class TestXML { @SuppressWarnings("unchecked") public static void main(

通過JDK的JAXBContext來轉換java實體bean和xml格式字串的一些問題和解決辦法

    這兩天工作中用到web service來推送資料,涉及到xml的和java實體類的轉換,總結一下理解和碰到的問題。    (一)、寶寶想得到下面這樣的兩個xml型別的字串anth和args,來推送給第三方:<?xml version="1.0" encoding

java JavaBean(實體)化為map (利用Java反射實現)

/** * 獲取利用反射獲取類裡面的值和名稱轉化為map * * @param obj //JavaBean * @return map * @throws IllegalAccessException

ServiceStack DateTime數據Json出現的困擾

onf 導致 metadata tac cti add info != postman 執行dotnet-new selfhost sstest 創建項目,然後打開解決方案 修改ssTest.ServiceModel中的Hello.cs,在HellopResponse

數據庫表直接生成Java實體

dep script urn rac getclass direct time unicode auto 代碼如下: package com.nagios.info.entity; import java.io.File; import java.io.F

java 實體 時間格式字段註解

小時 mat timezone att string 使用 如果 格式 字段 @DatetimeFormat是將String轉換成Date,一般前臺給後臺傳值時用 @JsonFormat(pattern="yyyy-MM-dd") 將Date轉換成String 一般後臺傳值

json出現的死循環問題--SSH

耗資源 config nco conf hiberna 問題 現在 不能 ssh 主要原因: 是在json時hibernate才會加載數據(懶加載)加載出來的數據又有其他關系數據又去加載其他的數據,而其他的數據又包含了本類數據進入死循環 這種現象一般出現在多表查詢時 解決方

Java : 實體不能序列化異常

serial 異常 序列 join col 添加 序列化 之間 是否 當修改實體類之後調用接口出現不能序列化的異常時,一定要檢查實體之間的關系是否都是正確的. could not serialize; nested exception is org.hibernate.ty

java解析和組裝json以及一些方法的理解

content 獲取 con imei title 報錯 bsp ava 取值 這是一個json格式的字符串 第一種情況(簡單格式) String result = "{\"name\":\"小明\",\"age\":\"12\"}";JSONObject json =