JsonUtil工具类

Posted 邓博泽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JsonUtil工具类相关的知识,希望对你有一定的参考价值。

  1. package comm;     
  2.     
  3. import java.text.SimpleDateFormat;     
  4. import java.util.ArrayList;     
  5. import java.util.Collection;     
  6. import java.util.Date;     
  7. import java.util.HashMap;     
  8. import java.util.Iterator;     
  9. import java.util.List;     
  10. import java.util.Map;     
  11.     
  12. import net.sf.ezmorph.MorpherRegistry;     
  13. import net.sf.ezmorph.object.DateMorpher;     
  14. import net.sf.json.JSONArray;     
  15. import net.sf.json.JSONObject;     
  16. import net.sf.json.JsonConfig;     
  17. import net.sf.json.processors.JsonValueProcessor;     
  18. import net.sf.json.util.JSONUtils;     
  19. import net.sf.json.xml.XMLSerializer;     
  20.     
  21. public class JsonUtil {     
  22.     
  23.     /**   
  24.      * 设置日期转换格式   
  25.      */    
  26.     static {     
  27.         //注册器     
  28.         MorpherRegistry mr = JSONUtils.getMorpherRegistry();     
  29.     
  30.         //可转换的日期格式,即Json串中可以出现以下格式的日期与时间     
  31.         DateMorpher dm = new DateMorpher(new String[] { Util.YYYY_MM_DD,     
  32.                 Util.YYYY_MM_DD_HH_MM_ss, Util.HH_MM_ss, Util.YYYYMMDD,     
  33.                 Util.YYYYMMDDHHMMSS, Util.HHMMss });     
  34.         mr.registerMorpher(dm);     
  35.     }     
  36.     
  37.     /**   
  38.     * 从json串转换成实体对象   
  39.     * @param jsonObjStr e.g. {‘name‘:‘get‘,‘dateAttr‘:‘2009-11-12‘}   
  40.     * @param clazz Person.class   
  41.     * @return   
  42.     */    
  43.     public static Object getDtoFromJsonObjStr(String jsonObjStr, Class clazz) {     
  44.         return JSONObject.toBean(JSONObject.fromObject(jsonObjStr), clazz);     
  45.     }     
  46.     
  47.     /**   
  48.     * 从json串转换成实体对象,并且实体集合属性存有另外实体Bean   
  49.     * @param jsonObjStr e.g. {‘data‘:[{‘name‘:‘get‘},{‘name‘:‘set‘}]}   
  50.     * @param clazz e.g. MyBean.class   
  51.     * @param classMap e.g. classMap.put("data", Person.class)   
  52.     * @return Object   
  53.     */    
  54.     public static Object getDtoFromJsonObjStr(String jsonObjStr, Class clazz, Map classMap) {     
  55.         return JSONObject.toBean(JSONObject.fromObject(jsonObjStr), clazz, classMap);     
  56.     }     
  57.     
  58.     /**   
  59.     * 把一个json数组串转换成普通数组   
  60.     * @param jsonArrStr  e.g. [‘get‘,1,true,null]   
  61.     * @return Object[]   
  62.     */    
  63.     public static Object[] getArrFromJsonArrStr(String jsonArrStr) {     
  64.         return JSONArray.fromObject(jsonArrStr).toArray();     
  65.     }     
  66.     
  67.     /**   
  68.     * 把一个json数组串转换成实体数组   
  69.     * @param jsonArrStr e.g. [{‘name‘:‘get‘},{‘name‘:‘set‘}]   
  70.     * @param clazz e.g. Person.class   
  71.     * @return Object[]   
  72.     */    
  73.     public static Object[] getDtoArrFromJsonArrStr(String jsonArrStr, Class clazz) {     
  74.         JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);     
  75.         Object[] objArr = new Object[jsonArr.size()];     
  76.         for (int i = 0; i < jsonArr.size(); i++) {     
  77.             objArr[i] = JSONObject.toBean(jsonArr.getJSONObject(i), clazz);     
  78.         }     
  79.         return objArr;     
  80.     }     
  81.     
  82.     /**   
  83.     * 把一个json数组串转换成实体数组,且数组元素的属性含有另外实例Bean   
  84.     * @param jsonArrStr e.g. [{‘data‘:[{‘name‘:‘get‘}]},{‘data‘:[{‘name‘:‘set‘}]}]   
  85.     * @param clazz e.g. MyBean.class   
  86.     * @param classMap e.g. classMap.put("data", Person.class)   
  87.     * @return Object[]   
  88.     */    
  89.     public static Object[] getDtoArrFromJsonArrStr(String jsonArrStr, Class clazz,     
  90.             Map classMap) {     
  91.         JSONArray array = JSONArray.fromObject(jsonArrStr);     
  92.         Object[] obj = new Object[array.size()];     
  93.         for (int i = 0; i < array.size(); i++) {     
  94.             JSONObject jsonObject = array.getJSONObject(i);     
  95.             obj[i] = JSONObject.toBean(jsonObject, clazz, classMap);     
  96.         }     
  97.         return obj;     
  98.     }     
  99.     
  100.     /**   
  101.     * 把一个json数组串转换成存放普通类型元素的集合   
  102.     * @param jsonArrStr  e.g. [‘get‘,1,true,null]   
  103.     * @return List   
  104.     */    
  105.     public static List getListFromJsonArrStr(String jsonArrStr) {     
  106.         JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);     
  107.         List list = new ArrayList();     
  108.         for (int i = 0; i < jsonArr.size(); i++) {     
  109.             list.add(jsonArr.get(i));     
  110.         }     
  111.         return list;     
  112.     }     
  113.     
  114.     /**   
  115.     * 把一个json数组串转换成集合,且集合里存放的为实例Bean   
  116.     * @param jsonArrStr e.g. [{‘name‘:‘get‘},{‘name‘:‘set‘}]   
  117.     * @param clazz   
  118.     * @return List   
  119.     */    
  120.     public static List getListFromJsonArrStr(String jsonArrStr, Class clazz) {     
  121.         JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);     
  122.         List list = new ArrayList();     
  123.         for (int i = 0; i < jsonArr.size(); i++) {     
  124.             list.add(JSONObject.toBean(jsonArr.getJSONObject(i), clazz));     
  125.         }     
  126.         return list;     
  127.     }     
  128.     
  129.     /**   
  130.     * 把一个json数组串转换成集合,且集合里的对象的属性含有另外实例Bean   
  131.     * @param jsonArrStr e.g. [{‘data‘:[{‘name‘:‘get‘}]},{‘data‘:[{‘name‘:‘set‘}]}]   
  132.     * @param clazz e.g. MyBean.class   
  133.     * @param classMap e.g. classMap.put("data", Person.class)   
  134.     * @return List   
  135.     */    
  136.     public static List getListFromJsonArrStr(String jsonArrStr, Class clazz, Map classMap) {     
  137.         JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);     
  138.         List list = new ArrayList();     
  139.         for (int i = 0; i < jsonArr.size(); i++) {     
  140.             list.add(JSONObject.toBean(jsonArr.getJSONObject(i), clazz, classMap));     
  141.         }     
  142.         return list;     
  143.     }     
  144.     
  145.     /**   
  146.     * 把json对象串转换成map对象   
  147.     * @param jsonObjStr e.g. {‘name‘:‘get‘,‘int‘:1,‘double‘,1.1,‘null‘:null}   
  148.     * @return Map   
  149.     */    
  150.     public static Map getMapFromJsonObjStr(String jsonObjStr) {     
  151.         JSONObject jsonObject = JSONObject.fromObject(jsonObjStr);     
  152.     
  153.         Map map = new HashMap();     
  154.         for (Iterator iter = jsonObject.keys(); iter.hasNext();) {     
  155.             String key = (String) iter.next();     
  156.             map.put(key, jsonObject.get(key));     
  157.         }     
  158.         return map;     
  159.     }     
  160.     
  161.     /**   
  162.     * 把json对象串转换成map对象,且map对象里存放的为其他实体Bean   
  163.     * @param jsonObjStr e.g. {‘data1‘:{‘name‘:‘get‘},‘data2‘:{‘name‘:‘set‘}}   
  164.     * @param clazz e.g. Person.class   
  165.     * @return Map   
  166.     */    
  167.     public static Map getMapFromJsonObjStr(String jsonObjStr, Class clazz) {     
  168.         JSONObject jsonObject = JSONObject.fromObject(jsonObjStr);     
  169.     
  170.         Map map = new HashMap();     
  171.         for (Iterator iter = jsonObject.keys(); iter.hasNext();) {     
  172.             String key = (String) iter.next();     
  173.             map.put(key, JSONObject.toBean(jsonObject.getJSONObject(key), clazz));     
  174.         }     
  175.         return map;     
  176.     }     
  177.     
  178.     /**   
  179.      * 把json对象串转换成map对象,且map对象里存放的其他实体Bean还含有另外实体Bean   
  180.      * @param jsonObjStr e.g. {‘mybean‘:{‘data‘:[{‘name‘:‘get‘}]}}   
  181.      * @param clazz e.g. MyBean.class   
  182.      * @param classMap  e.g. classMap.put("data", Person.class)   
  183.      * @return Map   
  184.      */    
  185.     public static Map getMapFromJsonObjStr(String jsonObjStr, Class clazz, Map classMap) {     
  186.         JSONObject jsonObject = JSONObject.fromObject(jsonObjStr);     
  187.     
  188.         Map map = new HashMap();     
  189.         for (Iterator iter = jsonObject.keys(); iter.hasNext();) {     
  190.             String key = (String) iter.next();     
  191.             map.put(key, JSONObject     
  192.                     .toBean(jsonObject.getJSONObject(key), clazz, classMap));     
  193.         }     
  194.         return map;     
  195.     }     
  196.     
  197.     /**   
  198.      * 把实体Bean、Map对象、数组、列表集合转换成Json串   
  199.      * @param obj    
  200.      * @return   
  201.      * @throws Exception String   
  202.      */    
  203.     public static String getJsonStr(Object obj) {     
  204.         String jsonStr = null;     
  205.         //Json配置         
  206.         JsonConfig jsonCfg = new JsonConfig();     
  207.     
  208.         //注册日期处理器     
  209.         jsonCfg.registerJsonValueProcessor(java.util.Date.class,     
  210.                 new JsonDateValueProcessor(Util.YYYY_MM_DD_HH_MM_ss));     
  211.         if (obj == null) {     
  212.             return "{}";     
  213.         }     
  214.     
  215.         if (obj instanceof Collection || obj instanceof Object[]) {     
  216.             jsonStr = JSONArray.fromObject(obj, jsonCfg).toString();     
  217.         } else {     
  218.             jsonStr = JSONObject.fromObject(obj, jsonCfg).toString();     
  219.         }     
  220.     
  221.         return jsonStr;     
  222.     }     
  223.     
  224.     /**   
  225.      * 把json串、数组、集合(collection map)、实体Bean转换成XML   
  226.      * XMLSerializer API:   
  227.      * http://json-lib.sourceforge.net/apidocs/net/sf/json/xml/XMLSerializer.html   
  228.      * 具体实例请参考:   
  229.      * http://json-lib.sourceforge.net/xref-test/net/sf/json/xml/TestXMLSerializer_writes.html   
  230.      * http://json-lib.sourceforge.net/xref-test/net/sf/json/xml/TestXMLSerializer_writes.html   
  231.      * @param obj    
  232.      * @return   
  233.      * @throws Exception String   
  234.      */    
  235.     public static String getXMLFromObj(Object obj) {     
  236.         XMLSerializer xmlSerial = new XMLSerializer();     
  237.     
  238.         //Json配置         
  239.         JsonConfig jsonCfg = new JsonConfig();     
  240.     
  241.         //注册日期处理器     
  242.         jsonCfg.registerJsonValueProcessor(java.util.Date.class,     
  243.                 new JsonDateValueProcessor(Util.YYYY_MM_DD_HH_MM_ss));     
  244.     
  245.         if ((String.class.isInstance(obj) && String.valueOf(obj).startsWith("["))     
  246.                 || obj.getClass().isArray() || Collection.class.isInstance(obj)) {     
  247.             JSONArray jsonArr = JSONArray.fromObject(obj, jsonCfg);     
  248.             return xmlSerial.write(jsonArr);     
  249.         } else {     
  250.             JSONObject jsonObj = JSONObject.fromObject(obj, jsonCfg);     
  251.             return xmlSerial.write(jsonObj);     
  252.         }     
  253.     }     
  254.     
  255.     /**   
  256.      * 从XML转json串   
  257.      * @param xml   
  258.      * @return String   
  259.      */    
  260.     public static String getJsonStrFromXML(String xml) {     
  261.         XMLSerializer xmlSerial = new XMLSerializer();     
  262.         return String.valueOf(xmlSerial.read(xml));     
  263.     }     
  264.     
  265. }     
  266.     
  267. /**   
  268.  * json日期值处理器实现     
  269.  * (C) 2009-9-11, jzj   
  270.  */    
  271. class JsonDateValueProcessor implements JsonValueProcessor {     
  272.     
  273.     private String format = Util.YYYY_MM_DD_HH_MM_ss;     
  274.     
  275.     public JsonDateValueProcessor() {     
  276.     
  277.     }     
  278.     
  279.     public JsonDateValueProcessor(String format) {     
  280.         this.format = format;     
  281.     }     
  282.     
  283.     public Object processArrayValue(Object value, JsonConfig jsonConfig) {     
  284.         return process(value, jsonConfig);     
  285.     }     
  286.     
  287.     public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {     
  288.         return process(value, jsonConfig);     
  289.     }     
  290.     
  291.     private Object process(Object value, JsonConfig jsonConfig) {     
  292.         if (value instanceof Date) {     
  293.             String str = new SimpleDateFormat(format).format((Date) value);     
  294.             return str;     
  295.         }     
  296.         return value == null ? null : value.toString();     
  297.     }     
  298.     
  299.     public String getFormat() {     
  300.         return format;     
  301.     }     
  302.     
  303.     public void setFormat(String format) {     
  304.         this.format = format;     
  305.     }     
  306.     
  307. }    

 

JsonUtilTest

  1. package comm.test;     
  2.     
  3. import java.text.SimpleDateFormat;     
  4. import java.util.ArrayList;     
  5. import java.util.Date;     
  6. import java.util.HashMap;     
  7. import java.util.Iterator;     
  8. import java.util.LinkedHashMap;     
  9. import java.util.LinkedHashSet;     
  10. import java.util.List;     
  11. import java.util.Map;     
  12. import java.util.Set;     
  13.     
  14. import junit.framework.TestCase;     
  15.     
  16. import comm.JsonUtil;     
  17.     
  18. /**   
  19.  * JsonUtil测试类   
  20.  * (C) 2009-9-11, jzj   
  21.  */    
  22. public class JsonUtilTest extends TestCase {     
  23.     
  24.     /**   
  25.      * 从json串转换成实体对象,且实体中Date属性能正确转换   
  26.      *  void   
  27.      */    
  28.     public void testGetDtoFromJsonObjStr1() {     
  29.         String json = "{‘name‘:‘get‘,‘dateAttr‘:‘2009-11-12‘}";     
  30.         Person ps = (Person) JsonUtil.getDtoFromJsonObjStr(json, Person.class);     
  31.         //print: get     
  32.         System.out.println(ps.getName());     
  33.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");     
  34.         //print: 2009-11-12     
  35.         System.out.println(sdf.format(ps.getDateAttr()));     
  36.     }     
  37.     
  38.     /**   
  39.      * 从json串转换成实体对象,并且实体集合属性存有另外实体Bean   
  40.      *  void   
  41.      */    
  42.     public void testGetDtoFromJsonObjStr3() {     
  43.         String json = "{‘data‘:[{‘name‘:‘get‘},{‘name‘:‘set‘}]}";     
  44.         Map classMap = new HashMap();     
  45.         classMap.put("data", Person.class);     
  46.         MyBean myBean = (MyBean) JsonUtil.getDtoFromJsonObjStr(json, MyBean.class,     
  47.                 classMap);     
  48.         //print: class comm.test.Person name =get            
  49.         System.out.println(myBean.getData().get(0).getClass() + " name ="    
  50.                 + ((Person) myBean.getData().get(0)).getName());     
  51.         //print: class comm.test.Person name =set     
  52.         System.out.println(myBean.getData().get(1).getClass() + " name ="    
  53.                 + ((Person) myBean.getData().get(1)).getName());     
  54.     }     
  55.     
  56.     /**   
  57.      * 把一个json数组串转换成普通数组   
  58.      *  void   
  59.      */    
  60.     public void testGetArrFromJsonArrStr() {     
  61.         String json = "[‘get‘,1,true,null]";     
  62.         Object[] objArr = JsonUtil.getArrFromJsonArrStr(json);     
  63.         for (int i = 0; i < objArr.length; i++) {     
  64.             System.out.println(objArr[i].getClass() + " " + objArr[i]);     
  65.         }     
  66.         /*  print:   
  67.             class java.lang.String get   
  68.             class java.lang.Integer 1   
  69.             class java.lang.Boolean true   
  70.             class net.sf.json.JSONNull null   
  71.          */    
  72.     }     
  73.     
  74.     /**   
  75.      * 把一个json数组串转换成实体数组   
  76.      *  void   
  77.      */    
  78.     public void testGetDtoArrFromJsonArrStr1() {     
  79.         String json = "[{‘name‘:‘get‘},{‘name‘:‘set‘}]";     
  80.         Object[] objArr = JsonUtil.getDtoArrFromJsonArrStr(json, Person.class);     
  81.         for (int i = 0; i < objArr.length; i++) {     
  82.             System.out.println(objArr[i].getClass() + " name = "    
  83.                     + ((Person) objArr[i]).getName());     
  84.         }     
  85.         /*  print:   
  86.             class comm.test.Person name = get   
  87.             class comm.test.Person name = set   
  88.          */    
  89.     }     
  90.     
  91.     /**   
  92.      * 把一个json数组串转换成实体数组,且数组元素的属性含有另外实例Bean   
  93.      *  void   
  94.      */    
  95.     public void testGetDtoArrFromJsonArrStr2() {     
  96.         String json = "[{‘data‘:[{‘name‘:‘get‘}]},{‘data‘:[{‘name‘:‘set‘}]}]";     
  97.         Map classMap = new HashMap();     
  98.         classMap.put("data", Person.class);     
  99.         Object[] objArr = JsonUtil.getDtoArrFromJsonArrStr(json, MyBean.class, classMap);     
  100.         for (int i = 0; i < objArr.length; i++) {     
  101.             System.out.println(((MyBean) objArr[i]).getData().get(0).getClass()     
  102.                     + " name = "    
  103.                     + ((Person) ((MyBean) objArr[i]).getData().get(0)).getName());     
  104.         }     
  105.         /*  print:   
  106.             class comm.test.Person name = get   
  107.             class comm.test.Person name = set   
  108.          */    
  109.     }     
  110.     
  111.     /**   
  112.      * 把一个json数组串转换成存放普通类型元素的集合   
  113.      *  void   
  114.      */    
  115.     public void testGetListFromJsonArrStr1() {     
  116.         String json = "[‘get‘,1,true,null]";     
  117.         List list = JsonUtil.getListFromJsonArrStr(json);     
  118.         for (int i = 0; i < list.size(); i++) {     
  119.             System.out.println(list.get(i).getClass() + " " + list.get(i));     
  120.         }     
  121.         /*  print:   
  122.             class java.lang.String get   
  123.             class java.lang.Integer 1   
  124.             class java.lang.Boolean true   
  125.             class net.sf.json.JSONNull null   
  126.          */    
  127.     }     
  128.     
  129.     /**   
  130.      * 把一个json数组串转换成集合,且集合里存放的为实例Bean   
  131.      *  void   
  132.      */    
  133.     public void testGetListFromJsonArrStr2() {     
  134.         String json = "[{‘name‘:‘get‘},{‘name‘:‘set‘}]";     
  135.         List list = JsonUtil.getListFromJsonArrStr(json, Person.class);     
  136.         for (int i = 0; i < list.size(); i++) {     
  137.             System.out.println(list.get(i).getClass() + " name = "    
  138.                     + ((Person) list.get(i)).getName());     
  139.         }     
  140.         /*  print:   
  141.             class comm.test.Person name = get   
  142.             class comm.test.Person name = set   
  143.          */    
  144.     }     
  145.     
  146.     /**   
  147.      * 把一个json数组串转换成集合,且集合里的对象的属性含有另外实例Bean   
  148.      *  void   
  149.      */    
  150.     public void testGetListFromJsonArrStr3() {     
  151.         String json = "[{‘data‘:[{‘name‘:‘get‘}]},{‘data‘:[{‘name‘:‘set‘}]}]";     
  152.         Map classMap = new HashMap();     
  153.         classMap.put("data", Person.class);     
  154.         List list = JsonUtil.getListFromJsonArrStr(json, MyBean.class, classMap);     
  155.         for (int i = 0; i < list.size(); i++) {     
  156.             System.out.println(((MyBean) list.get(i)).getData().get(0).getClass()     
  157.                     + " name = "    
  158.                     + ((Person) ((MyBean) list.get(i)).getData().get(0)).getName());     
  159.         }     
  160.         /*  print:   
  161.             class comm.test.Person name = get   
  162.             class comm.test.Person name = set   
  163.          */    
  164.     }     
  165.     
  166.     /**   
  167. &nb

    以上是关于JsonUtil工具类的主要内容,如果未能解决你的问题,请参考以下文章

    JsonUtil工具类

    JsonUtil工具类

    JsonUtil jakson工具类

    利用Jackson封装常用JsonUtil工具类

    Android工具类整合

    Android工具类整合