1. 程式人生 > >使用jackson轉json解決雙向關聯迴圈呼叫

使用jackson轉json解決雙向關聯迴圈呼叫

ITOO V1.0的開發算是告一段落了,現在是整理總結交接環節,在這個專案中常見的問題也該好好整理一下和大家分享了,這次主要介紹轉json迴圈呼叫的問題。

一、問題背景

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


其實這個問題在上次的.NET專案中遇到過,所以這個問題是一個常見問題,只不過因為這次實在java中第一次遇到,但是迴圈呼叫的原理還是沒有改變的。

二、解決方案

由於剛java專案的經驗不豐富,之前實體關係也沒有這次專案中的複雜,所以沒有解決過,不過學會站在巨人的肩膀上還是解決問題的一個很好的途徑,其實這個問題的解決方案有很多種,這裡我選擇了一種比較好的:

1、首先我們需要引入jacksonjar包:

可在這裡下載。

2、封裝轉json的工具類:

package itoo.basic.tool.json;

import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.ObjectMapper;


/**
 * 轉換json的工具類 
 * @author 陳麗娜
 * @version 1.0.0 , 2014年12月23日 下午3:24:33
 */
public class JacksonJsonUntil{
	public JsonGenerator jsonGenerator=null;
	public ObjectMapper objectMapper=null;
	
	/**
	 * 將物件轉換為json字串
	 * @param response 向前臺傳遞資料時的格式
	 * @param obj 需要轉換的物件(可以為list)
	 * @throws Exception 異常處理
	 */
	public void beanToJson(HttpServletResponse response,Object obj) throws Exception{
		response.setContentType("application/json;charset=UTF-8");//防止資料傳遞亂碼
		objectMapper =new ObjectMapper();
		try {
			String json=objectMapper.writeValueAsString(obj);//將物件轉成json
			
			PrintWriter out=response.getWriter();//列印到前臺
			out.write(json);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}


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

這裡不再以單個的實體為例,用到的註解是:

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中不會產生多餘的欄位;

三、總結

jackson解決迴圈呼叫的問題,只是避開了迴圈呼叫,而不是真正的從根本上解決,希望以後可以解決這個問題。