- 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;
- }
- }
JsonUtilTest
- 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));
- }
- }