本示例基于前面几篇文章的代码。
一、JSON-lib框架,转换JSON
1、首先要去官方下载json-lib工具包
本示例中使用的是v2.3;json-lib还需要以下依赖包:
jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6
官方网址:http://json-lib.sourceforge.net/
然后在工程中添加如下jar包:
如果你还不了解JSON是什么?那么你应该可以看看http://www.json.org/json-zh.html
2、 要转换的JavaBean的代码如下:
package com.wy.pojo;
import java.io.Serializable;
/**
* User对象必须实现serializable接口,因为放在session中的数据必须是可序列化的。
* 否则会出现错误 setAttribute: Non-serializable attribute...
* @author Administrator
* @version 2011-10-6
*/
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String password;
private int age;
private String sex;
private String birthday;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.username +"#"+ this.password +"#"+ this.age +"#"+ this.sex +"#"+ this.birthday;
}
}
3、 新建JsonlibTest测试类,基本代码如下:
package com.wy.junittest; import org.junit.Before; import org.junit.Test; import com.wy.controller.annotation.EntryOrJsonController; public class JsonlibTest { @Before public void setUp() throws Exception { } //@Test public void testEntry2Json() { new EntryOrJsonController().entry2Json(); } //@Test public void testList2Json() { new EntryOrJsonController().list2Json(); } //@Test public void testMap2Json() { new EntryOrJsonController().map2Json(); } //@Test public void testJson2Entry() { new EntryOrJsonController().json2Entry(); } //@Test public void testJson2MorphDynaBean() { new EntryOrJsonController().json2MorphDynaBean(); } //@Test public void testJson2Array() { new EntryOrJsonController().json2Array(); } //@Test public void testJson2List() { new EntryOrJsonController().json2List(); } //@Test public void testJson2Collection() { new EntryOrJsonController().json2Collection(); } @Test public void testJson2Map() { new EntryOrJsonController().json2Map(); } }
JSON中重要的对象:JSONObject、JSONArray、JSONSerializer,下面也是围绕着这几个对象来说明问题。
JSONObject是将Java对象转换成一个json的Object形式。
JSONArray是将一个Java对象转换成json的Array格式。
JSONSerializer也一样可以完成将Java对象转换成JSON。
JSONObject、JSONArray、JSONSerializer不仅可以将Java对象转换成JSON,还可以将JSON转换成Java对象。
Java对象序列化成JSON对象
1、 将JavaObject转换吃JSON字符串
/** * 1、 将JavaObject转换成JSON字符串 * JSONObject是将Java对象转换成一个json的Object形式, * JSONArray是将一个Java对象转换成json的Array格式。 * JSONSerializer是将Java对象转换成一个json。 * * JSONArray、JSONObject、JSONSerializer可以将Java对象转换成JSON,也可将JSON字符串转换成Java对象。 */ @SuppressWarnings("static-access") public void entry2Json(){ user = new User(); user.setUsername("wy"); user.setPassword("321"); user.setAge(23); user.setSex("man"); user.setBirthday(new SimpleDateFormat("yyyy-MM-d").format(new Date())); log.info("==============Java Bean >>> JSON Object=================="); JSONArray ja = jsonArray.fromObject(user); JSONObject jo = jsonObject.fromObject(user); JSON jsja = jsonSerializer.toJSON(user); log.info("JSONArray: \r\n"+ja+"\r\n"+"JSONObject: \r\n"+jo+"\r\n"+"JSONSerializer: \r\n"+jsja); }
2、 将JavaList集合转换吃JSON字符串
/** * 2.将JavaList集合转换吃JSON字符串 * 如果你是转换List集合,一定得用JSONArray或是JSONSrializer提供的序列化方法。 * 如果你用JSONObject.fromObject方法转换List会出现异常, * 通常使用JSONSrializer这个JSON序列化的方法,它会自动识别你传递的对象的类型,然后转换成相应的JSON字符串。 */ @SuppressWarnings("static-access") public void list2Json(){ List<User> userList = new ArrayList<User>(); for(int i=0;i<3;i++){ user = new User(); user.setUsername("wy"+i); user.setPassword("321"+i); user.setAge(23+i); user.setSex("man"+i); user.setBirthday(new SimpleDateFormat("yyyy-MM-d").format(new Date())+" "+i); userList.add(user); } log.info("==============Java List >>> JSON Object=================="); JSONArray ja = jsonArray.fromObject(userList); //JSONObject jo = jsonObject.fromObject(userList); +"JSONObject: \r\n"+jo+"\r\n" JSON jsja = jsonSerializer.toJSON(userList); log.info("JSONArray: \r\n"+ja+"\r\n"+"JSONSerializer: \r\n"+jsja); }
3、 将Map集合转换成JSON对象
/** * 3.将Map集合转换成JSON对象 * */ @SuppressWarnings("static-access") public void map2Json(){ user = new User(); user.setUsername("wy"); user.setPassword("321"); user.setAge(23); user.setSex("man"); user.setBirthday(new SimpleDateFormat("yyyy-MM-d").format(new Date())); Map<String, Object> map = new HashMap<String, Object>(); map.put("bool", Boolean.TRUE); map.put("int", 321); map.put("Long", 321.01); map.put("Str", "wy"); map.put("array", new String[]{"wy", "321"}); map.put("func", "function(i){ return this.arr[i]; }"); map.put("user", user); log.info("==============Java Map >>> JSON Object=================="); JSONArray ja = jsonArray.fromObject(map); JSONObject jo = jsonObject.fromObject(map); JSON jsja = jsonSerializer.toJSON(map); log.info("JSONArray: \r\n"+ja+"\r\n"+"JSONObject: \r\n"+jo+"\r\n"+"JSONSerializer: \r\n"+jsja); }
JSON对象反序列化成Java对象
1、 将json字符串转成Java对
/** * 4.JSON对象反序列化成Java对象 * */ public void json2Entry(){ log.info("==============JSON Object String >>> Java Bean =================="); jsonObject = JSONObject.fromObject(json); User joUser = (User)JSONObject.toBean(jsonObject, User.class); log.info("JSONObject: \r\n"+joUser.toString()); }
2、 将json字符串转换成动态Java对象(MorphDynaBean)
/** * 5.将json字符串转换成动态Java对象(MorphDynaBean) * 转换后的对象Object是一个MorphDynaBean的动态JavaBean,通过PropertyUtils可以获得指定的属性的值。 */ public void json2MorphDynaBean(){ log.info("==============JSON Object String >>> Java MorphDynaBean =================="); JSON j = JSONSerializer.toJSON(json); Object obj = JSONSerializer.toJava(j);//MorphDynaBean String userName = null; try { userName = PropertyUtils.getProperty(obj, "username")+""; } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("JSONSerializer: \r\n"+obj.toString()+" "+userName); }
3、 将json字符串转成Java的Array数组
/** * 6. 将json字符串转成Java的Array数组 * */ public void json2Array(){ log.info("==============JSON String >>> Java Array =================="); json = "[" + json + "]"; jsonArray = JSONArray.fromObject(json); Object[] obj = jsonArray.toArray(); User[] user = (User[])JSONArray.toArray(jsonArray, User.class); log.info("JSONArray: \r\n"+obj+" "+obj[0]+"\r\n"+user+" "+user[0]); }
4、 将JSON字符串转成Java的List集合
/** * 7.将JSON字符串转成Java的List集合 */ public void json2List(){ json = "[" + json + "]"; log.info("==============JSON Array String >>> Java List =================="); jsonArray = JSONArray.fromObject(json); List<User> user = jsonArray.toList(jsonArray, User.class); log.info("JSONArray: \r\n"+user.get(0).toString()); }
5、 将json字符串转换成Collection接口
/** * 8.将json字符串转换成Collection接口 */ public void json2Collection(){ json = "[" + json + "]"; log.info("==============JSON Array String >>> Java Collection =================="); jsonArray = JSONArray.fromObject(json); Collection<User> user = jsonArray.toCollection(jsonArray, User.class); Object[] obj = user.toArray(); log.info("JSONArray: \r\n"+user+" "+obj); }
6、 将json字符串转换成Map集合
/** * 9.将json字符串转换成Map集合 */ public void json2Map(){ log.info("==============JSON String >>> Java Map =================="); jsonObject = JSONObject.fromObject(json); Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>(); clazzMap.put("A", User.class); Map<String, ?> mapBean = (Map) JSONObject.toBean(jsonObject, Map.class, clazzMap); log.info("JSONObject "+ mapBean); Set<String> set = mapBean.keySet(); Iterator<String> iter = set.iterator(); while (iter.hasNext()) { String key = iter.next(); log.info("JSONObject "+ key + ":" + mapBean.get(key).toString()); } }
将JSON返回到页面
1、HttpServletResponse
/** * 10. 将JSON返回到页面 * @param response */ public String entry2JSON(){ user = new User(); user.setUsername("wy"); user.setPassword("321"); user.setAge(23); user.setSex("man"); user.setBirthday(new SimpleDateFormat("yyyy-MM-d").format(new Date())); log.info("==============Java Bean >>> JSON Object=================="); JSONArray ja = jsonArray.fromObject(user); JSONObject jo = jsonObject.fromObject(user); JSON jsja = jsonSerializer.toJSON(user); return jo.toString(); } /** * 将JSON返回到页面 * @param response */ /*@RequestMapping(value="/returnJson", method=RequestMethod.GET) public void commonReturnType(HttpServletResponse response){ try { PrintWriter out = response.getWriter(); out.print(new EntryOrJsonController().entry2JSON()); out.flush(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }*/
2、PrintWriter out
/** * 将JSON返回到页面 * 默认策略生产viewName * @param out */ /*@RequestMapping(value="/returnJson", method=RequestMethod.POST) public void commonReturnType(PrintWriter out){//其实也是从HttpServletResponse 通过getWriter()得到out out.print(new EntryOrJsonController().entry2JSON()); out.flush(); out.close(); }*/
3、ModelAndView
@RequestMapping(value="/returnJson", method=RequestMethod.GET) public ModelAndView commonReturnType(){ ModelAndView mav = new ModelAndView(); mav.addObject("json", new EntryOrJsonController().entry2JSON()); mav.setViewName("returnJson"); return mav; }
4、@ResponseBody
/** * 注解 * 将JSON返回到页面 * 默认策略生产viewName * @return */ @ResponseBody @RequestMapping(value="/returnJson", method=RequestMethod.POST) public String commonReturnTypeAnno(){ String jsonAnnotation = new EntryOrJsonController().entry2JSON(); return jsonAnnotation; }
视图层接受JSON
returnJson.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>JSON输出到页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> JSON输出到页面. <br/> <c:if test="${json != null}"> 通过GET方式请求并以ModelAndView返回的JSON: ${json} </c:if> <c:if test="${jsonAnnotation != null}"> 完全基于注解返回的JSON: ${jsonAnnotation} </c:if> <form action="<%=path%>/returnJson.do" method="post"> <input type="submit" value="提交" /> </form> </body> </html>
附件中是完整的Controller。