下載: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都可以