◎筱米加步枪◎.Blog

Happy coding

json-lib中关于Date转换的问题

前两天,关于使用json-lib工具包来将一个java对象序列化成json串,结果总是报如下错误:

net.sf.json.JSONException: java.lang.reflect.InvocationTargetException

得原因是因为Java对象中存在Date类型的对象无法进行解析,但是我又必须使用Date类型,还好json-lib提供了可扩展的接口JsonValueProcessor接口来让我们自定义的处理Json返回值的接口,看具体的对日期返回值的操作扩展:(为缩小篇幅,注释没那么规范),另外需要依赖的第三方包有如下:

commons-beanutils.jar

commons-collections-3.1.jar

commons-lang-2.1.jar

commons-logging-1.1.1.jar

ezmorph-1.0.3.jar

json-lib-2.3-jdk15.jar

//Date日期类型的Json值处理器,可自定义一些类的处理方式,是json提供的一个扩展接口
public class DateJsonValueProcessor implements JsonValueProcessor {

	private String format = "yyyy-MM-dd'T'HH:mm:ss";   
    private SimpleDateFormat sdf = new SimpleDateFormat(format);   

    //处理数组的值
	@Override
	public Object processArrayValue(Object value, JsonConfig jsonConfig) {
		return this.process(value);
	}

	//处理对象的值
	@Override
	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
		return this.process(value);
	}
	
	//处理Date类型返回的Json数值
	private Object process(Object value) {
		if (value == null) {
			return "";
		} else if (value instanceof Date)
			return sdf.format((Date) value);
		else {
			return value.toString();
		}
	}
}
public class TestBean {
	
	private String name;
	
	private double price;
	
	//日期类型的时间
	private Date time;
        
        //....此处省略setter和getter
}
public class Test {

	//测试
	public static void main(String[] args) {
		//初始化信息
		TestBean testBean = new TestBean();
		testBean.setName("1234");
		testBean.setPrice(3.14145);
		testBean.setTime(new Date());
		
		JsonValueProcessor jsonProcessor = new DateJsonValueProcessor();
		JsonConfig jsonConfig = new JsonConfig();
		//注册值处理器
        jsonConfig.registerJsonValueProcessor(Date.class, jsonProcessor);
        String json = JSONSerializer.toJSON(testBean , jsonConfig).toString();
		System.out.println(json);
	}
}

结果符合我的要求如下:

{"name":"1234","price":3.14145,"time":"2010-11-09T19:46:29"}

ExtJs提交表单页面总回调failure解决方法

记得这个问题搞了一个多小时,真悲剧...

原因:回调success或failure是根据返回来的参数的json串中的"success"的值来决定的

例如返回:{"success":true}则调用success,如果返回{"success":false}则调用failure,因此在与Strust2中的Action中加入属性boolean success即可,并且需将其序列化为名字为"success",如下:

	@JSON(name = "success")
	public boolean isSuccess() {
		return success;
	}

Action可通过设定success的属性值来控制是返回success或failure

Strust2的json插件

最近在研究前端的交互部分,涉及到Struts2中使用json插件,总结下近日来看的一些材料和一些理解。以下这段摘自网上:

Json是一种轻量级的数据交换格式,JSon插件提供了一种名为json的ActionResultType 。一旦为Action指定了该结果处理类型,JSON插件就会自动将Action里的数据序列化成JSON格式的数据,并返回给客户端物理视图的JavaScript。简单的说,JSON插件允许我们JavaScript中异步的调用Action,而且Action不需要指定视图来显示Action的信息显示。而是由JSON插件来负责具体将Action里面具体的信息返回给调用页面。

其中使用方法中需要注意的几点:

1.要使用json插件就要在strust配置文件中的包继承关系改成json-default,如:

<package name="json" namespace="/json" extends="json-default">

2.选择序列化的结果可在strust中配置,可选择配置示例如下:

<!-- 序列化所有以get开头的方法 -->  
<result type="json" name="user"></result>    

<!-- 只序列化包含user.id属性 -->
<result type="json" name="user">
	<param name="includeProperties">user\.id</param>
</result>    

<!-- 不序列化user对象的任何属性 -->
<result type="json" name="list">
	<param name="excludeProperties">user</param>
</result>    

<!-- 只序列化根对象中的user -->
<result type="json">
	<param name="root">user</param>
</result>     

<!-- 不序列化父类中的属性对象-->
<result type="json">        
	<param name="ignoreHierarchy">false</param>
</result>

3.对一些属性的特殊处理可在action代码中去特殊的序列化,如:

[3.1]默认情况下以get方法开头的都会序列化,如果不想序列化,在action中的方法要打上注解
@JSON(serialize=false)

[3.2]如果在属性get方法上面加@JSON(name="newName"),则返回的json数据中名称是指定的新名称


[3.3]@JSON(format ="yyyy-MM-dd'T'HH:mm:ss")设置用于格式化输出、解析日期表单域的格式。

[3.4]@JSON(deserialize=true)设置是否反序列化该属性

JavaScript对Json的增删改属性

使用JS对Json数据的处理,项目遇到需要对Json数据进行相关操作,比如增删改操作,本以为会比较难,网上搜索下,发现还是比较简单的,贴一段代码:

<script type="text/javascript">
		var json = {
			"age":24,
			"name":"cst"
		};
		//修改Json中的age值,因为Json中存在age属性
		json["age"] = 30;
		alert(json.age); //30

		//增加Json中的sex值,因为Json中不存在sex属性
		json["sex"] = "M";
		alert(json.sex); //M

		<!-- 遍历Json中的数据 -->
		for(var key in json){
			try{
				var value = eval("json['" +  key +"']");
				alert(key+"_"+value);
			}catch(e){}
		}

		//删除Json数据中的age属性
		delete json["age"];
		alert(json.age); //undefined

	</script>