GsonBuilder gb=new GsonBuilder() ;
gb.excludeFieldsWithoutExposeAnnotation();
Gson gson = gb.create();
userList = userService.findAll();
userJson = gson.toJson(userList);
getResponse().setContentType("application/json,charset=UTF-8");
PrintWriter out = getResponse().getWriter();
out.print(userJson);
out.flush();
out.close();
最后只用@Expose序列化需要的pojo实体类属性。。。。。
@Expose
private String id;
@Expose
private String username;
//----------------------------
//不需要序列化的属性
private String createTime;
//set,get
//配置关系维护,双方不用放弃任何一方
//网上其他的好像写序列化过滤策略,或属性值过滤策略,看的不是很懂,就简单的先用现在的吧。。。
//----------------------------------
刚刚又犯了一个错误:
<jsp:include page="../include/top.jsp">
<c: param name="tag" value="contact"/>
</jsp:include>
----------------------
中间的写成c标签的了,正确的应该为:
<jsp:include page="../include/top.jsp">
<jsp :param name="tag" value="contact"/>
</jsp:include>
这样解析到json中的数据就不再有createTime属性
------------------------------------(异常)
org.apache.jasper.JasperException: /WEB-INF/content/message/list-success.jsp(17,7) Expecting "jsp:param" standard action with "name" and "value" attributes
--------------------------------------------------------------------------------
话说gson循环引用的解决方法,一种是只序列化需要的元素,
第二种就是配置生成策略,下面是从网上找的一篇例子:
//gsonbulider创建对象:
public class GsonFactory {
public static Gson build(final List<String> fieldExclusions, final List<Class<?>> classExclusions) {
GsonBuilder b = new GsonBuilder();
b.addSerializationExclusionStrategy(new ExclusionStrategy() { //过滤策略
@Override
public boolean shouldSkipField(FieldAttributes f) { //需要过滤的字段
return fieldExclusions == null ? false : fieldExclusions.contains(f.getName());
}
@Override
public boolean shouldSkipClass(Class<?> clazz) { //需要过滤的类
return classExclusions == null ? false : classExclusions.contains(clazz);
}
});
return b.create();
}
}
//使用实例
static {
List<String> fieldExclusions = new ArrayList<String>();
fieldExclusions.add("id");
fieldExclusions.add("provider");
fieldExclusions.add("products");
List<Class<?>> classExclusions = new ArrayList<Class<?>>();
classExclusions.add(Product.class);
GSON = GsonFactory.build(null, classExclusions);
}
private static final Gson GSON;
public String getSomeJson(){
List<Provider> list = getEntitiesFromDatabase(); //从数据库生成list集合
return GSON.toJson(list);
}
下面是我自己的处理方法:举例(一个组对应多个用户)
package com.lk.pojo;
import java.util.List;
import javax.persistence.Entity;
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 org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.GenericGenerator;
import com.google.gson.annotations.Expose;
@Entity
@Table(name="t_user")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {
@Expose
private String id;
@Expose
private String username;
@Expose
private String password;
@Expose
private String email;
@Expose
private String createTime;
@Expose
private boolean enable;
private UserGroup userGroup;
//这个脑袋上什么都不加
@Id
@GenericGenerator(name="userid",strategy="uuid")
@GeneratedValue(generator="userid")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
}
/**
* 用户分组(多个用户在一个组里)
* @return
*/
@ManyToOne
@JoinColumn(name="groupid")
public UserGroup getUserGroup() {
return userGroup;
}
public void setUserGroup(UserGroup userGroup) {
this.userGroup = userGroup;
}
}
package com.lk.pojo;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.GenericGenerator;
import com.google.gson.annotations.Expose;
@Entity
@Table(name="t_usergroup")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class UserGroup {
@Expose
private String id;
@Expose
private String groupName;
@Expose
private String createTime;
@Expose
private List<User> userList; //这个脑袋上加@Expose
@Id
@GenericGenerator(name="usergroupid",strategy="uuid")
@GeneratedValue(generator="usergroupid")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
@OneToMany(mappedBy="userGroup")
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
json生成,我用的Gson,不过原理都是一样的吧........
@ParentPackage("json-default")
@Namespace("/user")
public class UserJsonAction extends BaseAction{
private static final long serialVersionUID = 1L;
@Action(value="userJson",
results={@Result(name=SUCCESS,type="json")
})
public String userJson() throws IOException{
userList = userService.findAll();
userJson = getGson().toJson(userList);
getResponse().setContentType("application/json,charset=UTF-8");
PrintWriter out = getResponse().getWriter();
out.print(userJson);
out.flush();
out.close();
return SUCCESS;
}
public Gson getGson(){
GsonBuilder gb=new GsonBuilder() ;
gb.excludeFieldsWithoutExposeAnnotation(); //没有加@Expose的那部分不要生成json
Gson gson = gb.create();
return gson;
}
}