struts2返回json串

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;
	}

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		dataMap.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()方法上。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值