package comm; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.sf.ezmorph.MorpherRegistry; import net.sf.ezmorph.object.DateMorpher; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValueProcessor; import net.sf.json.util.JSONUtils; import net.sf.json.xml.XMLSerializer; public class JsonUtil { /** * 设置日期转换格式 */ static { //注册器 MorpherRegistry mr = JSONUtils.getMorpherRegistry(); //可转换的日期格式,即Json串中可以出现以下格式的日期与时间 DateMorpher dm = new DateMorpher(new String[] { Util.YYYY_MM_DD, Util.YYYY_MM_DD_HH_MM_ss, Util.HH_MM_ss, Util.YYYYMMDD, Util.YYYYMMDDHHMMSS, Util.HHMMss }); mr.registerMorpher(dm); } /** * 从json串转换成实体对象 * @param jsonObjStr e.g. {'name':'get','dateAttr':'2009-11-12'} * @param clazz Person.class * @return */ public static Object getDtoFromJsonObjStr(String jsonObjStr, Class clazz) { return JSONObject.toBean(JSONObject.fromObject(jsonObjStr), clazz); } /** * 从json串转换成实体对象,并且实体集合属性存有另外实体Bean * @param jsonObjStr e.g. {'data':[{'name':'get'},{'name':'set'}]} * @param clazz e.g. MyBean.class * @param classMap e.g. classMap.put("data", Person.class) * @return Object */ public static Object getDtoFromJsonObjStr(String jsonObjStr, Class clazz, Map classMap) { return JSONObject.toBean(JSONObject.fromObject(jsonObjStr), clazz, classMap); } /** * 把一个json数组串转换成普通数组 * @param jsonArrStr e.g. ['get',1,true,null] * @return Object[] */ public static Object[] getArrFromJsonArrStr(String jsonArrStr) { return JSONArray.fromObject(jsonArrStr).toArray(); } /** * 把一个json数组串转换成实体数组 * @param jsonArrStr e.g. [{'name':'get'},{'name':'set'}] * @param clazz e.g. Person.class * @return Object[] */ public static Object[] getDtoArrFromJsonArrStr(String jsonArrStr, Class clazz) { JSONArray jsonArr = JSONArray.fromObject(jsonArrStr); Object[] objArr = new Object[jsonArr.size()]; for (int i = 0; i < jsonArr.size(); i++) { objArr[i] = JSONObject.toBean(jsonArr.getJSONObject(i), clazz); } return objArr; } /** * 把一个json数组串转换成实体数组,且数组元素的属性含有另外实例Bean * @param jsonArrStr e.g. [{'data':[{'name':'get'}]},{'data':[{'name':'set'}]}] * @param clazz e.g. MyBean.class * @param classMap e.g. classMap.put("data", Person.class) * @return Object[] */ public static Object[] getDtoArrFromJsonArrStr(String jsonArrStr, Class clazz, Map classMap) { JSONArray array = JSONArray.fromObject(jsonArrStr); Object[] obj = new Object[array.size()]; for (int i = 0; i < array.size(); i++) { JSONObject jsonObject = array.getJSONObject(i); obj[i] = JSONObject.toBean(jsonObject, clazz, classMap); } return obj; } /** * 把一个json数组串转换成存放普通类型元素的集合 * @param jsonArrStr e.g. ['get',1,true,null] * @return List */ public static List getListFromJsonArrStr(String jsonArrStr) { JSONArray jsonArr = JSONArray.fromObject(jsonArrStr); List list = new ArrayList(); for (int i = 0; i < jsonArr.size(); i++) { list.add(jsonArr.get(i)); } return list; } /** * 把一个json数组串转换成集合,且集合里存放的为实例Bean * @param jsonArrStr e.g. [{'name':'get'},{'name':'set'}] * @param clazz * @return List */ public static List getListFromJsonArrStr(String jsonArrStr, Class clazz) { JSONArray jsonArr = JSONArray.fromObject(jsonArrStr); List list = new ArrayList(); for (int i = 0; i < jsonArr.size(); i++) { list.add(JSONObject.toBean(jsonArr.getJSONObject(i), clazz)); } return list; } /** * 把一个json数组串转换成集合,且集合里的对象的属性含有另外实例Bean * @param jsonArrStr e.g. [{'data':[{'name':'get'}]},{'data':[{'name':'set'}]}] * @param clazz e.g. MyBean.class * @param classMap e.g. classMap.put("data", Person.class) * @return List */ public static List getListFromJsonArrStr(String jsonArrStr, Class clazz, Map classMap) { JSONArray jsonArr = JSONArray.fromObject(jsonArrStr); List list = new ArrayList(); for (int i = 0; i < jsonArr.size(); i++) { list.add(JSONObject.toBean(jsonArr.getJSONObject(i), clazz, classMap)); } return list; } /** * 把json对象串转换成map对象 * @param jsonObjStr e.g. {'name':'get','int':1,'double',1.1,'null':null} * @return Map */ public static Map getMapFromJsonObjStr(String jsonObjStr) { JSONObject jsonObject = JSONObject.fromObject(jsonObjStr); Map map = new HashMap(); for (Iterator iter = jsonObject.keys(); iter.hasNext();) { String key = (String) iter.next(); map.put(key, jsonObject.get(key)); } return map; } /** * 把json对象串转换成map对象,且map对象里存放的为其他实体Bean * @param jsonObjStr e.g. {'data1':{'name':'get'},'data2':{'name':'set'}} * @param clazz e.g. Person.class * @return Map */ public static Map getMapFromJsonObjStr(String jsonObjStr, Class clazz) { JSONObject jsonObject = JSONObject.fromObject(jsonObjStr); Map map = new HashMap(); for (Iterator iter = jsonObject.keys(); iter.hasNext();) { String key = (String) iter.next(); map.put(key, JSONObject.toBean(jsonObject.getJSONObject(key), clazz)); } return map; } /** * 把json对象串转换成map对象,且map对象里存放的其他实体Bean还含有另外实体Bean * @param jsonObjStr e.g. {'mybean':{'data':[{'name':'get'}]}} * @param clazz e.g. MyBean.class * @param classMap e.g. classMap.put("data", Person.class) * @return Map */ public static Map getMapFromJsonObjStr(String jsonObjStr, Class clazz, Map classMap) { JSONObject jsonObject = JSONObject.fromObject(jsonObjStr); Map map = new HashMap(); for (Iterator iter = jsonObject.keys(); iter.hasNext();) { String key = (String) iter.next(); map.put(key, JSONObject .toBean(jsonObject.getJSONObject(key), clazz, classMap)); } return map; } /** * 把实体Bean、Map对象、数组、列表集合转换成Json串 * @param obj * @return * @throws Exception String */ public static String getJsonStr(Object obj) { String jsonStr = null; //Json配置 JsonConfig jsonCfg = new JsonConfig(); //注册日期处理器 jsonCfg.registerJsonValueProcessor(java.util.Date.class, new JsonDateValueProcessor(Util.YYYY_MM_DD_HH_MM_ss)); if (obj == null) { return "{}"; } if (obj instanceof Collection || obj instanceof Object[]) { jsonStr = JSONArray.fromObject(obj, jsonCfg).toString(); } else { jsonStr = JSONObject.fromObject(obj, jsonCfg).toString(); } return jsonStr; } /** * 把json串、数组、集合(collection map)、实体Bean转换成XML * XMLSerializer API: * http://json-lib.sourceforge.net/apidocs/net/sf/json/xml/XMLSerializer.html * 具体实例请参考: * http://json-lib.sourceforge.net/xref-test/net/sf/json/xml/TestXMLSerializer_writes.html * http://json-lib.sourceforge.net/xref-test/net/sf/json/xml/TestXMLSerializer_writes.html * @param obj * @return * @throws Exception String */ public static String getXMLFromObj(Object obj) { XMLSerializer xmlSerial = new XMLSerializer(); //Json配置 JsonConfig jsonCfg = new JsonConfig(); //注册日期处理器 jsonCfg.registerJsonValueProcessor(java.util.Date.class, new JsonDateValueProcessor(Util.YYYY_MM_DD_HH_MM_ss)); if ((String.class.isInstance(obj) && String.valueOf(obj).startsWith("[")) || obj.getClass().isArray() || Collection.class.isInstance(obj)) { JSONArray jsonArr = JSONArray.fromObject(obj, jsonCfg); return xmlSerial.write(jsonArr); } else { JSONObject jsonObj = JSONObject.fromObject(obj, jsonCfg); return xmlSerial.write(jsonObj); } } /** * 从XML转json串 * @param xml * @return String */ public static String getJsonStrFromXML(String xml) { XMLSerializer xmlSerial = new XMLSerializer(); return String.valueOf(xmlSerial.read(xml)); } } /** * json日期值处理器实现 * (C) 2009-9-11, jzj */ class JsonDateValueProcessor implements JsonValueProcessor { private String format = Util.YYYY_MM_DD_HH_MM_ss; public JsonDateValueProcessor() { } public JsonDateValueProcessor(String format) { this.format = format; } public Object processArrayValue(Object value, JsonConfig jsonConfig) { return process(value, jsonConfig); } public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) { return process(value, jsonConfig); } private Object process(Object value, JsonConfig jsonConfig) { if (value instanceof Date) { String str = new SimpleDateFormat(format).format((Date) value); return str; } return value == null ? null : value.toString(); } public String getFormat() { return format; } public void setFormat(String format) { this.format = format; } }
package comm.test; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import junit.framework.TestCase; import comm.JsonUtil; /** * JsonUtil测试类 * (C) 2009-9-11, jzj */ public class JsonUtilTest extends TestCase { /** * 从json串转换成实体对象,且实体中Date属性能正确转换 * void */ public void testGetDtoFromJsonObjStr1() { String json = "{'name':'get','dateAttr':'2009-11-12'}"; Person ps = (Person) JsonUtil.getDtoFromJsonObjStr(json, Person.class); //print: get System.out.println(ps.getName()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //print: 2009-11-12 System.out.println(sdf.format(ps.getDateAttr())); } /** * 从json串转换成实体对象,并且实体集合属性存有另外实体Bean * void */ public void testGetDtoFromJsonObjStr3() { String json = "{'data':[{'name':'get'},{'name':'set'}]}"; Map classMap = new HashMap(); classMap.put("data", Person.class); MyBean myBean = (MyBean) JsonUtil.getDtoFromJsonObjStr(json, MyBean.class, classMap); //print: class comm.test.Person name =get System.out.println(myBean.getData().get(0).getClass() + " name =" + ((Person) myBean.getData().get(0)).getName()); //print: class comm.test.Person name =set System.out.println(myBean.getData().get(1).getClass() + " name =" + ((Person) myBean.getData().get(1)).getName()); } /** * 把一个json数组串转换成普通数组 * void */ public void testGetArrFromJsonArrStr() { String json = "['get',1,true,null]"; Object[] objArr = JsonUtil.getArrFromJsonArrStr(json); for (int i = 0; i < objArr.length; i++) { System.out.println(objArr[i].getClass() + " " + objArr[i]); } /* print: class java.lang.String get class java.lang.Integer 1 class java.lang.Boolean true class net.sf.json.JSONNull null */ } /** * 把一个json数组串转换成实体数组 * void */ public void testGetDtoArrFromJsonArrStr1() { String json = "[{'name':'get'},{'name':'set'}]"; Object[] objArr = JsonUtil.getDtoArrFromJsonArrStr(json, Person.class); for (int i = 0; i < objArr.length; i++) { System.out.println(objArr[i].getClass() + " name = " + ((Person) objArr[i]).getName()); } /* print: class comm.test.Person name = get class comm.test.Person name = set */ } /** * 把一个json数组串转换成实体数组,且数组元素的属性含有另外实例Bean * void */ public void testGetDtoArrFromJsonArrStr2() { String json = "[{'data':[{'name':'get'}]},{'data':[{'name':'set'}]}]"; Map classMap = new HashMap(); classMap.put("data", Person.class); Object[] objArr = JsonUtil.getDtoArrFromJsonArrStr(json, MyBean.class, classMap); for (int i = 0; i < objArr.length; i++) { System.out.println(((MyBean) objArr[i]).getData().get(0).getClass() + " name = " + ((Person) ((MyBean) objArr[i]).getData().get(0)).getName()); } /* print: class comm.test.Person name = get class comm.test.Person name = set */ } /** * 把一个json数组串转换成存放普通类型元素的集合 * void */ public void testGetListFromJsonArrStr1() { String json = "['get',1,true,null]"; List list = JsonUtil.getListFromJsonArrStr(json); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).getClass() + " " + list.get(i)); } /* print: class java.lang.String get class java.lang.Integer 1 class java.lang.Boolean true class net.sf.json.JSONNull null */ } /** * 把一个json数组串转换成集合,且集合里存放的为实例Bean * void */ public void testGetListFromJsonArrStr2() { String json = "[{'name':'get'},{'name':'set'}]"; List list = JsonUtil.getListFromJsonArrStr(json, Person.class); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).getClass() + " name = " + ((Person) list.get(i)).getName()); } /* print: class comm.test.Person name = get class comm.test.Person name = set */ } /** * 把一个json数组串转换成集合,且集合里的对象的属性含有另外实例Bean * void */ public void testGetListFromJsonArrStr3() { String json = "[{'data':[{'name':'get'}]},{'data':[{'name':'set'}]}]"; Map classMap = new HashMap(); classMap.put("data", Person.class); List list = JsonUtil.getListFromJsonArrStr(json, MyBean.class, classMap); for (int i = 0; i < list.size(); i++) { System.out.println(((MyBean) list.get(i)).getData().get(0).getClass() + " name = " + ((Person) ((MyBean) list.get(i)).getData().get(0)).getName()); } /* print: class comm.test.Person name = get class comm.test.Person name = set */ } /** * 把json对象串转换成map对象 * void */ public void testGetMapFromJsonObjStr() { String json = "{'name':'get','int':1,'double':1.1,'null':null}"; Map map = JsonUtil.getMapFromJsonObjStr(json); for (Iterator iter = map.keySet().iterator(); iter.hasNext();) { System.out.println(map.get(iter.next()).getClass()); } /* print: class java.lang.Double class net.sf.json.JSONNull class java.lang.Integer class java.lang.String */ } /** * 把json对象串转换成map对象,且map对象里存放的为其他实体Bean * void */ public void testGetMapFromJsonObjStr2() { String json = "{'data1':{'name':'get'},'data2':{'name':'set'}}"; Map map = JsonUtil.getMapFromJsonObjStr(json, Person.class); for (Iterator iter = map.keySet().iterator(); iter.hasNext();) { String key = (String) iter.next(); System.out.println(map.get(key).getClass() + " name=" + ((Person) map.get(key)).getName()); } /* print: class comm.test.Person name=set class comm.test.Person name=get */ } /** * 把json对象串转换成map对象,且map对象里 * 存放的其他实体Bean还含有另外实体Bean * void */ public void testGetMapFromJsonObjStr3() { String json = "{'mybean':{'data':[{'name':'get'}]}}"; Map classMap = new HashMap(); classMap.put("data", Person.class); Map map = JsonUtil.getMapFromJsonObjStr(json, MyBean.class, classMap); for (Iterator iter = map.keySet().iterator(); iter.hasNext();) { String key = (String) iter.next(); Object o = ((MyBean) map.get(key)).getData().get(0); System.out.println(o.getClass() + " name=" + ((Person) o).getName()); } /* print: class comm.test.Person name=get */ } /** * 实体Bean转json串 * void */ public void testgetJsonStr1() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); MyBean myBean = new MyBean(); List list = new ArrayList(); list.add(ps); myBean.setData(list); //print: {"data":[{"dateAttr":"2009-09-12 07:24:54","name":"get"}]} System.out.println(JsonUtil.getJsonStr(myBean)); } /** * map转json串 * void */ public void testgetJsonStr2() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); Map map = new LinkedHashMap(); map.put("person1", ps); //print: {"person1":{"dateAttr":"2009-09-12 07:24:27","name":"get"}} System.out.println(JsonUtil.getJsonStr(map)); } /** * 数组转json串 * void */ public void testgetJsonStr3() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); Person[] personArr = new Person[1]; personArr[0] = ps; //print: [{"dateAttr":"2009-09-12 07:23:54","name":"get"}] System.out.println(JsonUtil.getJsonStr(personArr)); } /** * list转json串 * void */ public void testgetJsonStr4() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); List list = new ArrayList(); list.add(ps); //print: [{"dateAttr":"2009-09-12 07:22:49","name":"get"}] System.out.println(JsonUtil.getJsonStr(list)); } /** * set转json串 * void */ public void testgetJsonStr5() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); Set set = new LinkedHashSet(); set.add(ps); //print: [{"dateAttr":"2009-09-12 07:22:16","name":"get"}] System.out.println(JsonUtil.getJsonStr(set)); } /** * json对象串转XML * void */ public void testGetXMLFromObj1() { System.out.println(JsonUtil .getXMLFromObj("{\"name\":\"json\",\"bool\":true,\"int\":1}")); /* print: <?xml version="1.0" encoding="UTF-8"?> <o> <bool type="boolean">true</bool> <int type="number">1</int> <name type="string">json</name> </o> */ } /** * json数组串转XML * void */ public void testGetXMLFromObj2() { System.out.println(JsonUtil.getXMLFromObj("[1,2,3]")); /* print: <?xml version="1.0" encoding="UTF-8"?> <a> <e type="number">1</e> <e type="number">2</e> <e type="number">3</e> </a> */ } /** * java数组转XML * void */ public void testGetXMLFromObj3() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); Person[] personArr = new Person[2]; personArr[0] = ps; System.out.println(JsonUtil.getXMLFromObj(personArr)); /* print: <?xml version="1.0" encoding="UTF-8"?> <a> <e class="object"> <dateAttr type="string">2009-09-12 06:58:55</dateAttr> <name type="string">get</name> </e> </a> */ } /** * list转XML * void */ public void testGetXMLFromObj4() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); List list = new ArrayList(); list.add(ps); System.out.println(JsonUtil.getXMLFromObj(list)); /* print: <?xml version="1.0" encoding="UTF-8"?> <a> <e class="object"> <dateAttr type="string">2009-09-12 07:02:31</dateAttr> <name type="string">get</name> </e> </a> */ } /** * set转XML * void */ public void testGetXMLFromObj5() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); Set set = new LinkedHashSet(); set.add(ps); System.out.println(JsonUtil.getXMLFromObj(set)); /* print: <?xml version="1.0" encoding="UTF-8"?> <a> <e class="object"> <dateAttr type="string">2009-09-12 07:04:38</dateAttr> <name type="string">get</name> </e> </a> */ } /** * map转XML * void */ public void testGetXMLFromObj6() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); Map map = new HashMap(); map.put("person1", ps); System.out.println(JsonUtil.getXMLFromObj(map)); /* print: <?xml version="1.0" encoding="UTF-8"?> <o> <person1 class="object"> <dateAttr type="string">2009-09-12 07:08:35</dateAttr> <name type="string">get</name> </person1> </o> */ } /** * 实体Bean转XML * void */ public void testGetXMLFromObj7() { Person ps = new Person(); ps.setDateAttr(new Date()); ps.setName("get"); System.out.println(JsonUtil.getXMLFromObj(ps)); /* print: <?xml version="1.0" encoding="UTF-8"?> <o> <dateAttr type="string">2009-09-12 07:13:02</dateAttr> <name type="string">get</name> </o> */ } /** * 从XML对象串转json串 * void */ public void testGetJsonStrFromXML1() { String xml = "<o><dateAttr type='string'>2009-09-12 07:13:02</dateAttr>" + "<name type='string'>get</name></o>"; //print: {"dateAttr":"2009-09-12 07:13:02","name":"get"} System.out.println(JsonUtil.getJsonStrFromXML(xml)); } /** * 从XML数组串转json串 * void */ public void testGetJsonStrFromXML2() { String xml = "<a class='array'><e class='object'><dateAttr type='string'>2009-09-12 07:04:38</dateAttr>" + "<name type='string'>get</name></e></a>"; //print: [{"dateAttr":"2009-09-12 07:04:38","name":"get"}] System.out.println(JsonUtil.getJsonStrFromXML(xml)); } }