您的位置:首页 > Web前端 > JavaScript

把实体 转为json 数据格式---jackson 的详细用法.

2013-01-06 13:28 417 查看
下载: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都可以
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: