java返回json的处理

在java中,关于json的lib有很多,比如jackjson、fastjson、gson等等,本人都用过,但是对于我等只需要让java对象返回json字符串即可的程序员来说,还是显得过于繁重。而且有些功能定制性很差,比如一个java对象的属性为空时,这些组件都不会输出,于是本人在页面循环遍历列表对象时,总是得判断此属性是否为undefined,这一点让本人很不满意。所以决定花点时间研究下到底是怎么回事。

但经过一上午的细看,发现不管是fastjson还是gson都代码都写得相当的复杂,又没什么相关的文档与注释,最后放弃了。于是自己又在www.json.com上找到了相对很简单的返回json的java包,这个lib只需要5个java类即可运行,正合我意。需要注意的是,官方的JSONArray这个东西并不支持javabean的直接转换,比如List<User>这样的东西是不能转换的,必须要把它转换成List<Map>这样的格式,才能转换,所以我对它进行了改造。官方的文件有:

先介绍下基本用法。

处理基本的java对象使用JSONObject类,用法大体如下:

	public void testMap(){
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("name", "qiu");
		map.put("password", "123");
		map.put("address", "china");
		
		User user = new User();
		user.setUserName("qiuqiu");
		user.setPassword("123456");
		user.getTels().add("1234444556677");
		user.getTels().add("6893493458585");
		
		map.put("user", user);
		
		JSONObject json = new JSONObject(map);
		System.out.println(json.toString());
	}
如果是collection对象,则采用JSONArray类,用法如下:
	public void testList() throws JSONException{
		List<User> list = new ArrayList<User>();
		
		User user = new User();
		user.setUserName("qiuqiu");
		user.setPassword("123456");
		user.getTels().add("1234444556677");
		user.getTels().add("6893493458585");
		
		User user2 = new User();
		user2.setUserName("中国");
		user2.getTels().add("1234444556677");
		user2.getTels().add("6893493458585");
		
		list.add(user);
		list.add(user2);
		
		JSONArray json = new JSONArray(list);
		
		System.out.println(json.toString(2));
	}
由上面的代码可以看出,这个lib的用法相当的简单,不像什么gson之类得新创建个对象,fastjson的API设计也有些不合理。上面的第二段代码中,有个toString(2)表示按换行缩进两个空格的方式输出。

上面只是介绍了基本用法,但这并不是自己想要的,自己想要的是怎么让对象属性为空时返回一个空字符串,而不是什么都不返回。虽然只有5个类,但本人还是花了两三个小时的才找到地方,在JSONObject中有个叫populateMap的方法,在最后有小段代码:

 Object result = method.invoke(bean, (Object[])null);
 if (result != null) {
     this.map.put(key, wrap(result));
 }

 即当调用get方法返回为null时,就不输出此属性。当然改起来就很简单了:

Object result = method.invoke(bean, (Object[])null);
this.map.put(key, result==null?"":wrap(result));
这样总算解决了本人想要解决的问题。当然这个lib是json官方自带的,写得相当的简单,比较适合一次数据只有几条或者几十条的情况,如分页显示等。如果一次传输数据量比较大的话,可以考虑使用fastjson等。但个人觉得对于大多数场合来说,最需要的是可定制性。比如偶尔发现个某组件不能满足的需要,结果此组件即无文档也无注释,代码又比较难理解,基本上跟没开源差不多,那就没什么意义了。

 

你可能感兴趣的:(java返回json的处理)