本示例基于前面几篇文章的代码。
一、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。