Json字符串 與 java對象

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成爲理想的數據交換語言。

    欲實現JSON字符串和java對象之間的互相轉換,方法有很多!本人也因爲項目上的需求,一度對這幾種方法做過研究和試驗!現將自己的一點小經驗分享與大家,如有紕漏,請指正!


  1.通過json_lib來實現對json和java對象之間的轉換,使用JSON-LIB可以極大的簡化JAVA對象轉換成JSON對象所需進行的操作,更可以避免人工操作生成JSON對象字符串時帶來的麻煩和誤操作:

   注:欲使用json_lib需要以下幾個jar包的支持:

json-lib-1.1-jdk15.jar  下載地址:http://json-lib.sourceforge.net

        commons-collections-3.2.1.jar

        commons-lang-2.4.jar

      commons-logging-1.1.1.jar

      commons-beanutils-1.8.0.jar

    以上commons系列包在tomcat/comon/lib下可以找到;

        ezmorph-1.0.6.jar    下載地址http://ezmorph.sourceforge.net

      morph-1.0.1 下載地址:http://morph.sourceforge.net

   有了這些jar包的支持,平時關於json處理的方法都可以找到對應的類;貼上一段代碼示例:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class JSONHelper {
                                    
     /**
      * 將JSONArray對象轉換成Map-List集合
      * @param jsonArr
      * @return
      */
     public static Object JsonToList(JSONArray jsonArr){
         List<Object> jsonObjList = new ArrayList<Object> ();
         for(Object obj : jsonArr){
             if(obj instanceof JSONArray){
                 jsonObjList.add(JsonToList((JSONArray) obj));
             } else if(obj instanceof JSONObject){
                 jsonObjList.add(JsonToMap((JSONObject) obj));
             }else{
                 jsonObjList.add(obj);
             }
         }
         return jsonObjList;
     }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    /**
     *  將JSONObjec對象轉換成Map-List集合
     * @param json
     * @return
     */
     public static Map<String, Object> JsonToMap(JSONObject json){
         Map<String,Object> columnValMap = new HashMap<String,Object>();
         Set<Object> jsonKeys = json.keySet();
         for (Object key : jsonKeys) {
             Object JsonValObj = json.get(key);
             if(JsonValObj instanceof JSONArray){
                columnValMap.put((String)key,  JsonToList((JSONArray) JsonValObj));
             }else if(key instanceof JSONObject){
                columnValMap.put((String)key,  JsonToMap((JSONObject) JsonValObj));
             }else{
                 columnValMap.put((String)key,JsonValObj);
             }
        }
         return columnValMap;
     }
                                                                                                                                                                  
     /**
      * 將json對象轉換爲map集合,通過此方法獲取存放map集合鍵的list集合
      * @param obj
      * @return
      */
     public static List<Object> mapKeys(Object obj){
         List<Object> keysList = new ArrayList<Object>();
         Map<String,Object> columnValMap = new HashMap<String,Object>();
         String columnStr = "column";
         if(obj instanceof JSONArray){
             List<Map<String, Object>> jsonObjList = new ArrayList<Map<String, Object>> ();
             jsonObjList = (List<Map<String, Object>>) JsonToList((JSONArray) obj);
             columnValMap =(Map<String, Object>) (jsonObjList.get(0));
             //以上三句可優化爲如下一句
             //columnValMap =(Map<String, Object>)(((List<Object>)JsonToList((JSONArray) obj)).get(0));
         }else if(obj instanceof JSONObject){
             columnValMap =JsonToMap((JSONObject) obj);
         }else{
             keysList.add(obj);
         }
         for(int i=0;i<columnValMap.keySet().size();i++){
             keysList.add(columnStr+(i+1));
         }
         System.out.println(keysList.size());
         return keysList;
     }
}


2.通過使用谷歌的Gson來處理json字符串,谷歌的Gson針對封裝的javaBean處理起來很方便,但對於未封裝的json字符串需要找到技巧處理起來也才能順手。

      使用谷歌的Gson當然也需要jar包的支持,這需要一個jar包:Gson.jar

      下載地址:http://code.google.com/p/google-gson/downloads/detail?name=google-gson-2.2.4-release.zip

       示例:將通過js獲取的json字符串轉換爲Map、List集合,代碼如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
public class JSONHelper {
    private Gson gson = new Gson();
                                                                                                                                                                   
    /**
      * 將json對象轉換爲map集合,通過此方法獲取存放map集合鍵的list集合
      * @param obj
      * @return
      */
    public static List<Object> mapKeys(Map<?,?> map){
         List<Object> keysList = new ArrayList<Object>();
         String columnStr="column";
         for(int i=0;i<map.keySet().size();i++){
             keysList.add(columnStr+(i+1));
         }
         System.out.println(keysList.size());
         return keysList;
    }
                                                                                                                                                           
    /**
     * 將傳入的json字符串轉換爲元素爲map集合的List集合
     * @param jsonArrStr
     * @return
     */
    public static List<Map<String, Object>> jsonObjList(String jsonArrStr) {
        List<Map<String, Object>> jsonObjList = new ArrayList<Map<String, Object>>();
        List<?> jsonList = Test.jsonToList(jsonArrStr);
        Gson gson = new Gson();
        for (Object object : jsonList) {
            String jsonStr = gson.toJson(object);
            Map<?, ?> json = Test.jsonToMap(jsonStr);
            jsonObjList.add((Map<String, Object>) json);
        }
        return jsonObjList;
    }
                                                                                                                                                                                                                                                                                                 
    /**
     * 將傳入的json字符串解析爲List集合
     * @param jsonStr
     * @return
     */
    public static List<?> jsonToList(String jsonStr) {
        List<?> ObjectList = null;
        Gson gson = new Gson();
        java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<?>>() {}.getType();
        ObjectList = gson.fromJson(jsonStr, type);
        return ObjectList;
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                 
    /**
     * 將傳入的json字符串解析爲Map集合
     * @param jsonStr
     * @return
     */
    public static Map<?, ?> jsonToMap(String jsonStr) {
        Map<?, ?> ObjectMap = null;
        Gson gson = new Gson();
        java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<Map<?,?>>() {}.getType();
        ObjectMap = gson.fromJson(jsonStr, type);
        return ObjectMap;
    }
}

 3.使用最輕量級的org.json.jar實現json字符串和java對象之間的互轉

       所需jar包:org.json.jar

       下載地址:www.json.org  或第三方:http://kiccp.sinaapp.com/store/info/111

       同樣實現對json字符串轉換爲Map、List集合,代碼如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
 * 此類是處理json字符串的工具類
 *
 * @author xiaomeng
 * @since 2013-08-27
 *
 */
public class JSONHelper {
    /**
     * 將json字符串轉換爲List集合
     *
     * @param jsonArrStr
     * @return
     */
    public static List<Map<String, Object>> jsonObjList(String jsonArrStr) {
        List<Map<String, Object>> jsonList = new ArrayList<Map<String, Object>>();
        JSONArray jsonArr = null;
        try {
            jsonArr = new JSONArray(jsonArrStr);
            jsonList = (List<Map<String, Object>>)JSONHelper.jsonToList(jsonArr);
        } catch (JSONException e) {
            System.out.println("Json字符串轉換異常!");
            e.printStackTrace();
        }
        return jsonList;
    }
    /**
     * 將json對象的鍵值存放在集合,映射table的column
     *
     * @param map
     * @return
     */
    public static List<String> jsonMapKeysList(Map<?, ?> map) {
        List<String> jsonjsonList = new ArrayList<String>();
        String columnStr = "column";
        for (int i = 0; i < map.keySet().size(); i++) {
            jsonjsonList.add(columnStr + (i + 1));
        }
        System.out.println(jsonjsonList.size());
        return jsonjsonList;
    }
    /**
     * 將傳遞近來的json數組轉換爲List集合
     *
     * @param jsonArr
     * @return
     * @throws JSONException
     */
    private static List<?> jsonToList(JSONArray jsonArr)
            throws JSONException {
        List<Object> jsonToMapList = new ArrayList<Object>();
        for (int i = 0; i < jsonArr.length(); i++) {
            Object object = jsonArr.get(i);
            if (object instanceof JSONArray) {
                jsonToMapList.add(JSONHelper.jsonToList((JSONArray) object));
            } else if (object instanceof JSONObject) {
                jsonToMapList.add(JSONHelper.jsonToMap((JSONObject) object));
            } else {
                jsonToMapList.add(object);
            }
        }
        return jsonToMapList;
    }
    /**
     * 將傳遞近來的json對象轉換爲Map集合
     *
     * @param jsonObj
     * @return
     * @throws JSONException
     */
    @SuppressWarnings("unchecked")
    private static Map<String, Object> jsonToMap(JSONObject jsonObj)
            throws JSONException {
        Map<String, Object> jsonMap = new HashMap<String, Object>();
        Iterator<String> jsonKeys = jsonObj.keys();
        while (jsonKeys.hasNext()) {
            String jsonKey = jsonKeys.next();
            Object jsonValObj = jsonObj.get(jsonKey);
            if (jsonValObj instanceof JSONArray) {
                jsonMap.put(jsonKey, JSONHelper.jsonToList((JSONArray) jsonValObj));
            } else if (jsonValObj instanceof JSONObject) {
                jsonMap.put(jsonKey, JSONHelper.jsonToMap((JSONObject) jsonValObj));
            } else {
                jsonMap.put(jsonKey, jsonValObj);
            }
        }
        return jsonMap;
    }
}

以上三種常用的json和java對象之間的互相轉換方法各有其特點,根據我的小經驗,現將其優缺點總如下,供參考!

    1.json_lib json解析框架

       優點:各種複雜json格式和對json處理的一般需求都可以做到

       缺點:所需支持的jar文件較多,並且關於jar包版本或許會出現一些雜七雜八的問題

    2.谷歌Gson對json的解析:

       優點:(1)。可以谷歌的Gson就是爲處理java對象和json之間轉換開發的框架,其可以很簡單、方便的對封裝的java對象和json格式文本之間的轉換,包括java工具類集合之間的轉換也很方便;(2)。相對json_lib框架來說,只需要一個Gson.jar就可以,需要jar文件數量少;

       缺點:由於其相對來說偏向於處理java對象和json之間的轉換,所以其只簡單的處理json字符串和集合類之間的轉換稍微需要一個過渡,就是使用反射確定轉換的java對象類型。

     3.org.json框架

       優點:在這三者之中,其實最輕量級、同谷歌Gson一樣所需jar文件也是最少的一種方法,並且其在處理json字符串到java集合的轉黃相對簡便

缺點:相對Gson處理java對象和json之間的轉換比較費事

綜述:這三種解析json的方法各有優缺點,具體可根據自己需求選擇使用。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章