使用jackson轉json解決雙向關聯循環調用

ITOO V1.0的開發算是告一段落了,如今是整理總結交接環節,在這個項目中常見的問題也該好好整理一下和你們分享了,此次主要介紹轉json循環調用的問題。html

1、問題背景

相信只要使用ORM映射實體關聯關係,實體中存在雙向關聯的都遇到過這樣的問題:java


其實這個問題在上次的.NET項目中遇到過,因此這個問題是一個常見問題,只不過由於此次實在java中第一次遇到,可是循環調用的原理仍是沒有改變的。數據庫

2、解決方案

因爲剛java項目的經驗不豐富,以前實體關係也沒有此次項目中的複雜,因此沒有解決過,不過學會站在巨人的肩膀上仍是解決問題的一個很好的途徑,其實這個問題的解決方案有不少種,這裏我選擇了一種比較好的:json

1、首先咱們須要引入jacksonjar包:app

https://cn.jarfire.org/jackson.all.html 工具

可在這裏下載。spa

2、封裝轉json的工具類:.net

  
  
  
  
  
  1. package itoo.basic.tool.json;
  2. import java.io.PrintWriter;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.codehaus.jackson.JsonGenerator;
  5. import org.codehaus.jackson.map.ObjectMapper;
  6. /**
  7. * 轉換json的工具類
  8. * @author 陳麗娜
  9. * @version 1.0.0 , 2014年12月23日 下午3:24:33
  10. */
  11. public class JacksonJsonUntil{
  12. public JsonGenerator jsonGenerator= null;
  13. public ObjectMapper objectMapper= null;
  14. /**
  15. * 將對象轉換爲json字符串
  16. * @param response 向前臺傳遞數據時的格式
  17. * @param obj 須要轉換的對象(能夠爲list)
  18. * @throws Exception 異常處理
  19. */
  20. public void beanToJson(HttpServletResponse response,Object obj) throws Exception{
  21. response.setContentType( "application/json;charset=UTF-8"); //防止數據傳遞亂碼
  22. objectMapper = new ObjectMapper();
  23. try {
  24. String json=objectMapper.writeValueAsString(obj); //將對象轉成json
  25. PrintWriter out=response.getWriter(); //打印到前臺
  26. out.write(json);
  27. } catch (Exception e) {
  28. // TODO: handle exception
  29. e.printStackTrace();
  30. }
  31. }
  32. }


3、在多對多關係的實體中加入註解:hibernate

這裏再也不以單個的實體爲例,用到的註解是:代理

1)排除屬性

@JsonIgnore,通常標記在屬性或方法上;做用於序列化與反序列化;

@JsonIgnoreProperties,若是是代理類,因爲沒法標記在屬性或方法上,因此,能夠標記在類聲明上;也做用於反序列化時的字段解析;

還有當使用hibernate的時候,查詢數據庫後產生的實體類是個代理類,這時候轉換JSON會報錯;

解決方法有兩種:

1)設置FAIL_ON_EMPTY_BEANS屬性,告訴Jackson空對象不要拋異常;

mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);

2)使用@JsonIgnoreProperties註解

在實體類聲明處加上@JsonIgnoreProperties(value = {"hibernateLazyInitializer","handler"})註解;

建議使用@JsonIgnoreProperties註解,這樣生成的JSON中不會產生多餘的字段;

3、總結

jackson解決循環調用的問題,只是避開了循環調用,而不是真正的從根本上解決,但願之後能夠解決這個問題。

原文地址:https://blog.csdn.net/jly4758/article/details/43085613
相關文章
相關標籤/搜索