1. 程式人生 > >Android開發-進階:Json字串轉換為java物件的各種實現方法[json_lib框架、Gson、org.json]

Android開發-進階:Json字串轉換為java物件的各種實現方法[json_lib框架、Gson、org.json]

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包的支援:

       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下可以找到; 

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

package util;
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

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

package util;
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

       同樣實現對json字串轉換為Map、List集合,程式碼如下:

package util;
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的方法各有優缺點,具體可根據自己需求選擇使用。 

相關推薦

Android開發-:Json字串轉換java物件各種實現方法[json_lib框架Gsonorg.json]

JSON (JavaScript Object Notation) 是一種輕量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition

Json字串轉換JS物件方法

                一般JSON字串轉換為JS物件,都使用var jsonStr="{a:1}";var jsonObj = eval("("+jsonStr+")");今天學習JQuery原始碼看到一下方法,原來還可以這樣解析JSON字串:  parseJSON: function( data

JSON字串轉換java的list型別的方式

List<Map> meterList= JSONArray.parseArray(paraMap.get("metersList").toString(),Map.class); 記錄一下 其中metersList是一個json格式的字串

json字串轉換JAVA物件

方法一:使用GSON庫 /** * 引數一:即將被轉換的JSON字串 * 引數二:JSON轉換成JAVA物件的型別 * 關於引數二,需要將JSON轉換的目標型別作為new TypeT

Android 十六位制字串轉換位元組與反轉

藍芽與硬體之間通訊一般採用十六進位制,所以需要將進位制進入轉換一下。 現提供幾個我使用的轉換方法: 1、十六進位制轉換為位元組 /** * 將十六進位制的字串轉換成位元組 * * @pa

Android開發——使用Dagger2

前言 關於Dagger2的學習,首先看的官方文件,確實看不懂。然後搜尋網路上的介紹博文,不乏一些講得比較好的,如這個。但終究不夠透徹,還是得回頭研究官方文件。本文不僅僅是翻譯,而是記錄了自己對官方文件的理解。 提供依賴的兩種方式 使用@Inject註解構造器 class

Android開發——測試

導言 每次使用Android Studio建立一個新的工程,都會看到類似如下的目錄結構: 我們編寫的Java程式碼全部放在最上面的包中,下面兩個使用紅線圈中的包總是沒有用過,僅僅知道他們是用於放置測試程式碼的。標註為androidTest的包放置UI相關的測試,標註為test

javaJSON字串轉換實體類物件,基於net sf json實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

做一次面向物件的體操:將JSON字串轉換巢狀物件的一種方法

能不能把這個JSON串轉成相應的物件,更易於使用呢? 為了方便講解,這裡重複寫下JSON串。 { “item:s_id:18006666”: “1024”, “item:s_id:18008888”: “1024”, “item:g_id:1800

js 將json字串轉換json物件方法解析(簡單處理JSON語法格式校驗問題)

js 將json字串轉換為json物件的方法解析 將json字串轉換為json物件的方法。在資料傳輸過程中,json是以文字,即字串的形式傳遞的,而JS操作的是JSON物件,所以,JSON物件和JSON字串之間的相互轉換是關鍵 例如: JSON字串: var str1 = ‘{

HenCoder Android 開發: 自定義 View 1-1 繪製基礎

自定義繪製概述 二話不說,我反手就是一個視訊:(視訊掛了,先直接點到優酷去看吧:優酷連結) 首先總結一下視訊中的關鍵點: 自定義繪製的方式是重寫繪製方法,其中最常用的是 onDraw() 繪製的關鍵是 Canvas 的使用 Canvas 的繪製類方法: drawXX

把unicode編碼的十六位制字串轉換漢字(Python2.7)

#小端位元組序轉為大端位元組序 def little2big_endian(hex_string): big_endian_str = '' #定義一個空字串 for i in range(len

將一個十六位制字串轉換十進位制數值的問題

在程式中,我們有時需要將一個十六進位制字串轉換為十進位制數字。比如: char *ptr="0x11"; int n=0; //我們想讓n等於0x11,即17 通常我們在C中,想將一個字串轉換為一整形

JSON字串轉換Map

本文是利用阿里巴巴封裝的FastJSON來轉換json字串的。例子如下: package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONO

Android開發之NIO非阻塞包(二)

有關Android NIO我們主要分為三大類,ByteBuffer、FileChannel和SocketChannel。由於篇幅原因今天Android123只對前兩個做說明。NIO和傳統的I/O比較大的區別在於傳輸方式非阻塞,一種基於事件驅動的模式,將會使方法執行完後立即返回

Android開發之NIO非阻塞包(三)

有關Android NIO的精髓主要用於高負載的Socket網路傳輸,相對於傳統I/O模型的Socket傳輸方式的優勢,我們已經在 Android開發進階之NIO非阻塞包(一) 中講到了,這裡不再贅述,一起來看看Android NIO有關Socket操作提供的類吧: 一、S

go語音之字串轉換

1、字串轉換 示例: package main import ( "fmt" "strconv" ) func main() { //轉換為字串後追加到位元組陣列 slice := make([]byte, 0, 1024) slice = strconv.Appe

js-json字串轉換json物件

來源:http://www.jb51.net/article/43136.htm 將json字串轉換為json物件的方法。在資料傳輸過程中,json是以文字,即字串的形式傳遞的,而JS操作的是JSON物件,所以,JSON物件和JSON字串之間的相互轉換是關鍵 例如:

Android開發:Activity和程序的回收和狀態恢復

不管是安卓的官方文件還是原始碼註釋,處處可見“從 Activity A 跳到 Activity B,當系統記憶體不足時 A 可能會被回收……”,而且沒有明確說明 A 和 B 是否屬於同一個 app 或程序。 但是,在官方給的 Activity 生命週期圖中

Js中把JSON字串轉換JSON物件(eval()new Function())

在我們利用js操作json資料時一般會用到eval進行資料轉換了,但有些朋友還喜歡使用function來轉換,下面我就給大家總結一下具體例子。 在JS中將JSON的字串解析成JSON資料格式,一般有兩種方式: 1.一種為使用eval()函式。 2. 使用Function物