采用json-lib進行Map與Json轉換

f663x 9年前發布 | 10K 次閱讀 Java JSON

    Json轉換工具實在之多,最近又聽說FastJson對Java序列化和反序列化最優,相比 Java自帶序列化、Json-lib、Jackson等。不過本人很青睞Gson,但是好像用的人也不是很多,項目中用的最多的就是垃圾Json-lib了,雖然爛,但是還是的繼續使用著,因為項目在我來之前已經搭建了,不過現在我推薦使用Jackson,官網說到這是Json工具中最快的一個,當然是有一點吹牛的,因為他沒有拿數據說話!之所以推薦Jackson,Jackson確實速度快,而且Spring內部原生支持Jackson對Json的轉換,也就是只要我們在XML中配置然后添加Jackson包,就大功告成了!

    對于其他的Json包,諸如simpleJson等,這些東西本人沒有什么了解,不過可以參考如下地址,看看maven倉庫中的介紹:

Maven Repository http://mvnrepository.com/search?q=Json

    好了,不多說了,下面開始把本人歸納總結的Map、List 與 Json之間轉換的代碼貼上,確實很簡單。

1、判斷是否滿足Json格式

    /**
         * 該字符串可能轉為 JSONObject 或 JSONArray
         * @param string
         * @return
         */
        public static boolean mayBeJSON(String string) {
            return ((string != null) && ((("null".equals(string))
                    || ((string.startsWith("[")) && (string.endsWith("]"))) || ((string
                    .startsWith("{")) && (string.endsWith("}"))))));
        }
        
        /**
         * 該字符串可能轉為JSONObject
         * @param string
         * @return
         */
        public static boolean mayBeJSONObject(String string) {
            return ((string != null) && ((("null".equals(string))
                     || ((string.startsWith("{")) && (string.endsWith("}"))))));
        }
        
        /**
         * 該字符串可能轉為 JSONArray
         * @param string
         * @return
         */
        public static boolean mayBeJSONArray(String string) {
            return ((string != null) && ((("null".equals(string))
                    || ((string.startsWith("[")) && (string.endsWith("]"))))));
        }


2、Json 與 Map 的轉換

 /**
      *函數注釋:parseJSON2Map()<br>
      *時間:2014-10-28-上午10:50:21<br>
      *用途:該方法用于json數據轉換為<Map<String, Object>
      *@param jsonStr
      *@return
      */
        public static Map<String, Object> parseJSON2Map(String jsonStr){  
            Map<String, Object> map = new HashMap<String, Object>();  
            //最外層解析  
            JSONObject json = JSONObject.fromObject(jsonStr);  
            for(Object k : json.keySet()){  
                Object v = json.get(k);   
                //如果內層還是數組的話,繼續解析  
                if(v instanceof JSONArray){  
                    List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();  
                    Iterator<JSONObject> it = ((JSONArray)v).iterator();  
                    while(it.hasNext()){  
                        JSONObject json2 = it.next();  
                        list.add(parseJSON2Map(json2.toString()));  
                    }  
                    map.put(k.toString(), list);  
                } else {  
                    map.put(k.toString(), v);  
                }  
            }  
            return map;  
        }  
        
        /**
              * 函數注釋:parseJSON2MapString()<br>
          * 用途:該方法用于json數據轉換為<Map<String, String><br>
          * 備注:***<br> 
          */
        public static Map<String, String> parseJSON2MapString(String jsonStr){  
            Map<String, String> map = new HashMap<String, String>();  
            //最外層解析  
            JSONObject json = JSONObject.fromObject(jsonStr);  
            for(Object k : json.keySet()){ 
                Object v = json.get(k);   
                if(null!=v){
                    map.put(k.toString(), v.toString());  
                }
            }  
            return map;  
        }


3、Json 與 List  的轉換

/**
     *函數注釋:parseJSON2List()<br>
     *用途:該方法用于json數據轉換為List<Map<String, Object>><br>
     */
     public static List<Map<String, Object>> parseJSON2List(String jsonStr){  
            JSONArray jsonArr = JSONArray.fromObject(jsonStr);  
            List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();  
            Iterator<JSONObject> it = jsonArr.iterator();  
            while(it.hasNext()){  
                JSONObject json2 = it.next();  
                list.add(parseJSON2Map(json2.toString()));  
            }  
            return list;  
        }
     
    /**
    * 函數注釋:parseJSON2ListString()<br>
    * 用途:該方法用于json數據轉換為List<Map<String, String>><br>
    */
     public static List<Map<String, String>> parseJSON2ListString(String jsonStr){  
                JSONArray jsonArr = JSONArray.fromObject(jsonStr);  
                List<Map<String, String>> list = new ArrayList<Map<String,String>>();  
                Iterator<JSONObject> it = jsonArr.iterator();  
                while(it.hasNext()){  
                    JSONObject json2 = it.next();  
                    list.add(parseJSON2MapString(json2.toString()));  
                }  
                return list;  
            }


4、List 或者 Map 與 Json的轉換

JSONObject.fromObject(obj).toString();
JSONArray.fromObject(obj).toString();


5、為什么不使用 JSONObject.toBean

    我的理由是:這個方法我相信用過的人都是恨之入骨,至少我是這樣的,以前寫過一個javaBean,結果硬是要javaBean中的屬性和Json的屬性完全相同,二者轉換才不會報錯。

6、提醒

    Json格式是要求value必須有雙引號,否則就不是標準的 Json, 那么,在上面提供的方法中,假設有個 Map<String,Object> 然而這個Object有可能是一個List<Map<String,Object>>,那么想要獲取里面的List對象時,可千萬不要調用parseJSON2Map,原因是他得到的值會把value中的雙引號全部去掉,那么這個結果是不符合Json規范的,后面在解析List就會出錯。

net.sf.json.JSONException: Unquotted string


正確的做法應該是 采用 JSONObject先解析成功JSONObject,然后再用JSONObject對象獲取List的Json字符串,然后調用上面的parseJSON2ListString,這樣就成功了!

7、提供一些Json幫助網站以及工具

1)Json在線校驗:http://www.bejson.com/

2)Json在線解析:火狐瀏覽器插件 json-handler 非常不錯

3)Json-lib 所需要的jar : http://download.csdn.net/detail/wp562846864/7238979



 本文由用戶 f663x 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!