JsonUtil 学习使用

本文介绍了一个实用的Java工具类,用于实现JSON与XML之间的相互转换。该工具支持复杂的数据结构转换,包括实体对象、集合及数组等,并提供详细的测试案例验证其功能。
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
[java] view plain copy
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));     
    }     
}  

<think>嗯,用户之前问过如何将Java中的字符串转换为数组,我之前介绍了两种方法,一种是手动处理,另一种是使用JSON库。现在用户接着问“JSONUtil可以嘛?”,需要先理解JSONUtil是什么,以及它在Java中的使用场景。 首先,JSONUtil可能指的是Hutool工具库中的JSONUtil类。Hutool是一个Java工具包,提供了很多便捷的方法,其中JSONUtil专门用于处理JSON数据。用户可能在项目中使用了Hutool,想知道是否可以用它来替代之前提到的Jackson或Gson。 接下来要确认用户的需求。用户之前的需求是将类似["绝密","机密"]的字符串转为数组,现在可能想找一个更简便的方法。Hutool的JSONUtil确实可以简化JSON的解析,所以需要给出具体的使用示例。 另外,需要考虑用户是否了解Hutool,可能需要简要介绍一下这个工具包,特别是JSONUtil的功能,比如解析、生成JSON、类型转换等。还要比较JSONUtil和其他库(如Jackson)的优缺点,帮助用户做出选择。 还要注意提醒用户添加Hutool的依赖,因为如果他们之前没有使用过,需要知道如何引入。同时,要强调处理复杂结构时JSONUtil的便利性,以及可能存在的性能问题,让用户根据项目情况决定。 最后,确保回答结构清晰,分点说明,并提供代码示例,让用户能够直接应用。同时要验证示例的正确性,避免出现错误。</think>可以!`JSONUtil` 通常是 Java 工具库(如 **Hutool**)提供的 JSON 处理工具类,能更简洁地将字符串转换为数组。以下是具体用法和对比分析: --- ### 方案1:使用 Hutool 的 `JSONUtil` **适用场景**:已引入 Hutool 依赖的项目,或需要快速实现简单 JSON 解析 **实现步骤**: ```java // 引入 Hutool 依赖后直接使用 import cn.hutool.json.JSONUtil; String str = "[\"绝密\",\"机密\"]"; // 一步转换为 List<String> List<String> list = JSONUtil.parseArray(str).toList(String.class); // 或直接转 String 数组 String[] arr = JSONUtil.parseArray(str).toArray(new String[0]); System.out.println(Arrays.toString(arr)); // [绝密, 机密] ``` --- ### 方案2:原生 `JSONArray`(不推荐) 如果是原生 `org.json` 库的 `JSONArray`: ```java import org.json.JSONArray; JSONArray jsonArray = new JSONArray(str); List<Object> list = jsonArray.toList(); // 需自行处理类型转换 ``` --- ### JSONUtil 的独特优势 1. **链式操作**:支持 `JSONUtil.parseXxx().toXxx()` 的流畅写法 2. **自动类型转换**: ```java // 自动识别数值、布尔等类型 String numStr = "[1, 2.5, true]"; List<Object> list = JSONUtil.parseArray(numStr).toList(Object.class); ``` 3. **灵活输入**:支持直接解析文件、输入流等 ```java String jsonFromFile = JSONUtil.readJSONObject(new File("data.json"), CharsetUtil.CHARSET_UTF_8).toString(); ``` --- ### 对比其他 JSON 库 | 特性 | Hutool-JSONUtil | Jackson | Gson | |--------------------|-----------------|---------------|---------------| | 依赖大小 | 小(仅 Hutool) | 中等 | 中等 | | 学习成本 | 低 | 高 | 中 | | 复杂嵌套处理 | 支持 | 优秀 | 优秀 | | 流式解析(大文件) | 不支持 | 支持 | 不支持 | | 性能 | 中等 | 高 | 高 | --- ### 最终建议 1. 如果项目已使用 Hutool,**优先选择 `JSONUtil`** 2. 需要处理复杂结构或高性能场景,建议用 **Jackson/Gson** 3. 可通过 Maven 添加 Hutool 依赖: ```xml <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> <!-- 使用最新版本 --> </dependency> ```
<think>好的,我现在需要回答用户关于Hutool库中JSONUtil类的parse()方法的使用说明和示例。首先,我得回忆一下Hutool的文档内容,或者查找相关的资料。记得Hutool是一个Java工具库,JSONUtil是处理JSON数据的工具类,而parse()方法应该用于解析JSON字符串或对象。 用户提供的引用内容中,引用[1]提到了使用JSONUtil.parse(实体类).toJSONString(0)和JSONUtil.toJsonStr(实体类)两种方式,其中前者被标记为比较原始且不好用,后者是常用方式。这说明parse()方法可能用于将Java对象转换为JSON结构,然后再序列化为字符串,而toJsonStr更直接。 接着,引用[3]提到了JsonObject的getByPath和setByPath方法,参数是表达式,这可能和解析后的JSON对象操作有关。引用[2]比较了不同JSON库的解析速度,但Hutool的JSON处理可能在性能上有一定特点。引用[4]是关于HTTP模块的示例,可能和JSONUtil使用场景相关,比如处理HTTP响应的JSON数据。 现在需要整理parse()方法的用途、参数、返回值以及使用示例。根据Hutool的文档,parse()方法有多个重载形式,可以接受字符串、Java对象、Map等,返回JSONObject或JSONArray。例如,将字符串解析为JSONObject,或者将Java对象转换为JSON结构。 需要注意的是,用户提到的示例中,JSONUtil.parse(实体类).toJSONString(0)可能是指将实体类对象转换为JSONObject,再生成不带缩进的字符串,而JSONUtil.toJsonStr(实体类)更简洁。这可能说明parse()方法用于处理需要进一步操作的JSON结构,而toJsonStr直接生成字符串。 需要给出不同使用场景的示例,比如解析字符串、转换Java对象、处理Map等,并说明可能的应用场景,如接口数据处理或日志记录。同时,需要指出parse()与toJsonStr的区别,帮助用户选择合适的方法。 最后,生成相关问题,可能涉及其他JSON处理方法、性能比较或异常处理等。要确保问题与用户的使用场景相关,帮助他们进一步学习。</think>### Hutool JSONUtil.parse() 方法使用说明 Hutool的`JSONUtil.parse()`方法主要用于**将不同格式的数据解析为JSON对象或数组**,支持字符串、Java对象、Map等多种输入类型。以下是具体说明和示例: --- #### 一、方法作用 1. **核心功能** 将输入数据解析为`JSONObject`或`JSONArray`,方便后续通过路径表达式操作JSON结构[^3]。 2. **重载形式** - `parse(Object)`:支持字符串、Java对象、Map等 - `parse(String)`:解析JSON字符串 - `parseFromXml(String)`:解析XML字符串为JSON对象 --- #### 二、使用示例 ##### 1. 解析JSON字符串 ```java import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; String jsonStr = "{\"name\":\"张三\",\"age\":25}"; JSONObject jsonObj = JSONUtil.parse(jsonStr).toJSONObject(0); // 转为JSONObject System.out.println(jsonObj.get("name")); // 输出:张三 ``` ##### 2. 转换Java对象为JSON ```java public class User { private String name; private int age; // 省略getter/setter } User user = new User(); user.setName("李四"); user.setAge(30); JSONObject json = JSONUtil.parse(user); // 将对象转为JSONObject String jsonStr = json.toString(); // 生成JSON字符串:{"name":"李四","age":30} ``` ##### 3. 解析Map集合 ```java Map<String, Object> map = new HashMap<>(); map.put("status", 200); map.put("data", Collections.singletonList("A", "B")); JSONObject json = JSONUtil.parse(map); // 支持嵌套结构解析 System.out.println(json.getByPath("data[0]")); // 输出:A ``` ##### 4. 处理HTTP响应中的JSON数据 ```java // 结合Hutool的HTTP模块使用(引用[4]) HttpResponse response = HttpRequest.get("https://api.example.com/data").execute(); String responseBody = response.body(); JSONObject result = JSONUtil.parse(responseBody).toJSONObject(0); System.out.println(result.getByPath("result.items[0].id")); ``` --- #### 三、`parse()`与`toJsonStr()`的区别 | 方法 | 输入类型 | 输出类型 | 适用场景 | |--------------------|------------|---------------|----------------------------| | `parse(obj)` | 对象/字符串 | JSONObject/Array | 需操作JSON结构(如路径查询) | | `toJsonStr(obj)` | 对象 | String | 直接生成JSON字符串(如日志输出) | > **示例对比** > ```java > // parse()方式(需额外调用toString) > String json1 = JSONUtil.parse(user).toString(); > > // toJsonStr()方式(一步完成) > String json2 = JSONUtil.toJsonStr(user); // 更简洁[^1] > ``` --- #### 四、常见问题 - **路径表达式操作** 使用`getByPath("key.subKey[0]")`可访问嵌套数据。 - **性能优化** 对于高频解析场景,建议复用`JSONObject`对象或使用更高效的库(如FastJSON)[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值