客户端使用Ajax访问struts2 , struts2如何返回一个json数据!json-lib与flexjson

错误提示:

21:21:25,316 ERROR runtime:96 - Template processing error: "Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: There is a cycle in the hierarchy!"

Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: There is a cycle in the hierarchy!
The problematic instruction:
----------
==> ${msgs[0][0]} [on line 76, column 25 in org/apache/struts2/dispatcher/error.ftl]
----------

Java backtrace for programmers:
----------
freemarker.template.TemplateModelException: Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: There is a cycle in the hierarchy!
	at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)
	at freemarker.ext.beans.SimpleMethodModel.get(SimpleMethodModel.java:138)
	at freemarker.core.DynamicKeyName.dealWithNumericalKey(DynamicKeyName.java:111)
	at freemarker.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:90)
	at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
	at freemarker.core.Expression.getStringValue(Expression.java:93)
	at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.IfBlock.accept(IfBlock.java:82)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.IfBlock.accept(IfBlock.java:82)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Environment.process(Environment.java:199)
	at freemarker.template.Template.process(Template.java:259)
	at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:845)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:567)
	at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:163)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:556)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:401)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:267)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:245)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:260)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
	at freemarker.ext.beans.SimpleMemberModel.unwrapArguments(SimpleMemberModel.java:86)
	at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106)
	... 37 more
21:21:40,429 ERROR runtime:96 - Template processing error: "Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: There is a cycle in the hierarchy!"

Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: There is a cycle in the hierarchy!
The problematic instruction:
----------
==> ${msgs[0][0]} [on line 76, column 25 in org/apache/struts2/dispatcher/error.ftl]
----------

Java backtrace for programmers:
----------
freemarker.template.TemplateModelException: Method public java.lang.String org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on net.sf.json.JSONException: There is a cycle in the hierarchy!
	at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)
	at freemarker.ext.beans.SimpleMethodModel.get(SimpleMethodModel.java:138)
	at freemarker.core.DynamicKeyName.dealWithNumericalKey(DynamicKeyName.java:111)
	at freemarker.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:90)
	at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
	at freemarker.core.Expression.getStringValue(Expression.java:93)
	at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.IfBlock.accept(IfBlock.java:82)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.IfBlock.accept(IfBlock.java:82)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Environment.process(Environment.java:199)
	at freemarker.template.Template.process(Template.java:259)
	at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:845)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:567)
	at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:163)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:556)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:401)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:267)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:245)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:260)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
	at freemarker.ext.beans.SimpleMemberModel.unwrapArguments(SimpleMemberModel.java:86)
	at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106)
	... 37 more
解决方法:

* 方案一: json-lib
* 方案二: flexjson  


AJAX过程中,请使用火狐查看通信过程中数据,调试js ---- firebug 经常使用console.info(信息);  (类似System.out )


json-lib 
**** TODO : json-lib 序列化日期对象出现异常  
如果两个对象互相关联,在序列化过程中 ,  net.sf.json.JSONException: There is a cycle in the hierarchy!  ---- 解决 JsonConfig 设置某个属性不进行序列化


flexjson 
导入 flexjson.jar 
JSONSerializer jsonSerializer = new JSONSerializer();
String result = jsonSerializer.serialize(customers); ------ 默认只会序列化当前对象,关联Order没有被序列化
String result = jsonSerializer.deepSerialize(customers); ----- 深度序列化,将关联对象序列化 


jsonSerializer.exclude("*.class"); // 不对getClass属性进行序列化  
** 没有日期问题 


代码:

package cn.itcast.bos.action;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JsonConfig;

import org.apache.struts2.ServletActionContext;

import cn.itcast.bos.domain.Customer;
import cn.itcast.bos.domain.Order;

import com.opensymphony.xwork2.ActionSupport;

import flexjson.JSONSerializer;

@SuppressWarnings("serial")
public class ShowCustomersAction extends ActionSupport {
	public String execute() throws Exception{
		//制作假数据,转换json返回
		Customer customer1 = new Customer(1001,"张三");
		Customer customer2 = new Customer(1002,"李四");
		
		Order order1 = new Order("order001","北京",customer1);
		Order order2 = new Order("order002","上海",customer2);
		Order order3 = new Order("order003","山东",customer1);
		
		customer1.getOrders().add(order1);
		customer1.getOrders().add(order3);
		customer2.getOrders().add(order2);
		
		List<Customer> customers = new ArrayList<Customer>();
		customers.add(customer1);
		customers.add(customer2);
		
		// json-lib ---- 使用JSONArray序列化List
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setExcludes(new String[]{"orders"}); //不序列化订单
		jsonConfig.setExcludes(new String[]{"customer"}); //序列化订单,阻止订单中客户
		JSONArray jsonArray = JSONArray.fromObject(customers,jsonConfig);
		sendBackToBrowser(jsonArray.toString());
		
		
		// 使用flexjson 可以解决死循环问题
		JSONSerializer jsonSerializer = new JSONSerializer();
		jsonSerializer.exclude("*.class"); //不对getClass属性进行序列化
		String result = jsonSerializer.deepSerialize(customers);
		sendBackToBrowser(result);
		return NONE;
	}

	private void sendBackToBrowser(String info) {
		ServletActionContext.getResponse().setContentType("text/json;charset=utf-8");
		try{
			ServletActionContext.getResponse().getWriter().print(info);
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}


你可能感兴趣的:(json)