把實體 轉為json 數據格式---jackson 的詳細用法.


下載:http://www.oschina.net/p/jackson

首先介紹三個注解:

@JsonAutoDetect (method/field):作用於方法或字段,用來表明,當生成json的時候忽略有該annotation的方法或字段

@JsonIgnore 過濾不需要轉成json的屬性

@JsonIgnoreProperties 主要用於過濾掉一些不需要的屬性

以上三個注解需要放在get方法前面才有效.

package com.sw.entity.base;

import static javax.persistence.GenerationType.IDENTITY;

import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonIgnore;

/**
 * Menu entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "menu", catalog = "zhong")
@JsonAutoDetect
public class Menu implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private Menu menu;
	private String icon;
	private String name;
	private Short seq;
	private String url;
	private String prem;
	private Set<Menu> menus = new HashSet<Menu>(0);

	// Constructors
	
	/**用於json輸出的屬性,不需要持久化;*/
	private String state = "open";
	
	/*********************************/
	
	/** default constructor */
	public Menu() {
	}

	/** minimal constructor */
	public Menu(Integer id) {
		this.id = id;
	}

	/** full constructor */
//省略構造器

	// Property accessors

/**省略了一下不需要處理的get/set方法*/

	@JsonIgnore  //標記該屬性不需要轉為 json
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "pid")
	public Menu getMenu() {
		return this.menu;
	}

	public void setMenu(Menu menu) {
		this.menu = menu;
	}

	

	@JsonIgnore //標記該屬性不需要轉為 json
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "menu")
	public Set<Menu> getMenus() {
		return this.menus;
	}

	public void setMenus(Set<Menu> menus) {
		this.menus = menus;
	}

	


 /*jackson就是根據get方法來獲取屬性值的,如果持久化的屬性值不符合你的要求,
可以通過更改get方法來實現。
比如說你的實體里有個set<xxx> xxx;的屬性,如果按照jackson原本的計划,集合類型會被轉為json數組,但你想把這個集合的內容轉成字符串,那么就可以通過get方法返回字符。或者說按照你的要求返回任何東西。*/

  //這個是為了樹形結構菜單標記字段,加上此注解表示該字段不需要持久化實體到數據庫
          @Transient
	public String getState() {
		if(this.getMenus()==null){
			state = "open";
		}else{
			state = "closed";
		}
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}
	
	

}

  以下是轉化代碼:

List<Menu> menus = menuManager.getChildrenById(aid,"pid","seq",true); //從數據庫取出list
ObjectMapper map = new ObjectMapper();//這是jackson的類庫
map.writeValue(Struts2Utils.getResponse().getWriter(),menus); //輸出json 這樣就把json數據輸出到瀏覽器客戶端了。

 

以下是值:

[{"name":"dfdsf","id":1,"state":"closed","seq":999,"prem":"fsfsd","icon":"fff","url":"gfdsfds"},
{"name":"fdsfds","id":2,"state":"closed","seq":999,"prem":"fsdf","icon":"fff","url":"efdsfsd"}]

jackson常用轉化形式:
writeValueAsString(value) 轉化為String
writeValueAsBytes(value) 轉化為byte
writeValue(objec0,bean) 此方法用於直接輸出json數據,
objec0代表輸出環境,可以是Response.getWriter()也可以是Outputstream.bean是要輸出的數據,集合和單個bean都可以


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM