struts2返回json串

来源:互联网 发布:淘宝店铺服务器出错 编辑:程序博客网 时间:2024/06/09 14:09

struts2的结果类型中有json这种结果类型,要想Struts2自动将会序列化的对象转化成为json,需要加入以下jar包commons-beanutils-1.7.0.jar、commons-collections-3.2.jar、commons-loggin-1.0.4.jar、commons-loggin-api-1.1.jar、json-lib-2.1-jdk15.jar、ognl-3.0.jar。

编写Action

Action跟普通的Action一样,一般往这个Action中放置一个Map属性,把要转化的对象都放到Map中

package com.daniel.struts.json;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.daniel.bean.User;import com.opensymphony.xwork2.ActionSupport;public class TestJson extends ActionSupport {private String xixi = "haah";private Map<String, Object> dataMap = new HashMap<String, Object>();/* (non-Javadoc) * @see com.opensymphony.xwork2.ActionSupport#execute() *//** * @return the dataMap */public Map<String, Object> getDataMap() {return dataMap;}/** * @param dataMap the dataMap to set */public void setDataMap(Map<String, Object> dataMap) {this.dataMap = dataMap;}/** * @return the xixi */public String getXixi() {return xixi;}/** * @param xixi the xixi to set */public void setXixi(String xixi) {this.xixi = xixi;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubdataMap.put("username", "daniel");dataMap.put("age", 12);User user = new User();user.setUsername("linsen");user.setPassword("123456");List<User> list = new ArrayList<User>();list.add(user);dataMap.put("records", list);dataMap.put("xixi", xixi);return super.execute();}}


配置Action

Action所在的包需要继承json-default

<package name="json" extends="json-default" namespace="/"><action name="testjon" class="com.daniel.struts.json.TestJson"><result name="success" type="json"><param name="root">dataMap</param></result></action></package>

返回的json串的格式

如果你将一个Map容器转换成为json串,那么通常会把这个Map<K,V>的K声明为字符串类型,而V声明为Object类型。在我的实践中,返回的json串主要是供前端jquery easyui来使用,所以,Map中的key会被转换成为json串中的key,Map中的Value会被转换成为json中的value。如果Map中的value存放了一个对象呢?那么这个对象也会被json串行化,将对象的属性名称作为key,对象的值作为value。下面举个例子,假设存在一个User类型,这个类型存在两个属性String username和String password。如果往Map中放入map.put("user", user)。假设user的username值为张三,而密码为888888。这样,Struts2对这个Map进行json串行化将得到如下结果:
{"user":  {"username": "张三", "password": "888888" } }。因为在json串中,属性名是要用双引号包含起来,其属性值要么是字符串、数值、对象或者数组,也不可能出现其他。
如果你将一个List容器转换成为json串,那么这个List将会被转换成为json对象,而且是一个只包含json数组的对象。比如List中内容是2个User对象,那么json串行化得到的结果如下:
{[{"username": "张三", "password" : "888888"}, {"username": "李四", "password": "888888"}]}。

json串行化带来的无限递归

无限递归,这是个很严重的问题,这意味着程序没有出口,这将引发一个很常见的问题——堆栈溢出。如果你使用Hibernate作为你的持久化层的解决方案,而且恰恰你又使用了双向关联,假设A与B存在双向关联,A中存在一个B类型的属性b,而B中存在一个A类型的属性a。在json串行化A时,A的非对象属性被串行化是没有问题的,但是在串行化A的b属性时,json发现这是一个对象,从而对这个b对象进行串行化,但是串行化b对象时又发现b存在一个a对象,从而串行化在a->b->a->b之间无限循环,这时候,Struts2会抛出一个异常。其实在json串行化时,完全不需要串行化关联对象,那么怎样去解决呢?目前,我只知道一种解决办法,那就是使用@JSON注解。
@JSON注解
这个注解只能使用在方法上,一般来说会放在类中与关联对象有关的getter方法上,如在A类型中使用,就将
@JSON(serialize=false)放在getB()方法上。


0 0