1. 程式人生 > >【java學習】Json框架

【java學習】Json框架

1,概念

1)JavaBean

JavaBean不是一個程式設計規則,也不是語法規範,它是一個習慣性的程式設計規範。在fastJson中,解析用到的實體類必須嚴格按照JavaBean規範來寫。
特點:
①類為public
②有一個無引數的構造方法。
③屬性為私有,通過getXxx()和setXxx方法設定屬性(方法的第四個字母為大寫)。
④必須實現序列號介面。

2)結構

json只支援下面兩種結構,只要是不符合上面兩種結構的都不被支援,並提示錯誤。所以json也不能有註釋。

①JSONObject(名稱/值對的集合:key : value樣式)

json物件,是系統有關JSON定義的基本單位,包含一對數值(key/value)。要求不能為null。

②JSONArray(值的有序列表:Array)

代表一組有序數值。
將JSONArray轉換為String輸出(toString)所表現的形式是用方括號包裹,數值以逗號分割。
例如:[value1,value2,value3]

3)JSONStringer

json文字構建類 ,這個類可以幫助快速和便捷的建立JSON text。
最大的優點是可以減少由於格式的錯誤導致程式異常,引用這個類可以自動嚴格按照JSON語法規則建立JSON text.每個JSONStringer實體只能對應對應建立一個JSON text.

4)JSONException

json中用到的異常。

5)json屬性

json物件要求屬性必須加雙引號。

2,Json(JavaScript Object Notation):

1)介紹

一種輕量級的資料交換格式。
JSON資料是一系列鍵值對的集合。

2)特點

體積小、解碼方便、易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網路傳輸速率)。
Android自帶的Json類庫:效率低,使用繁瑣,不支援反射解析,不推薦使用。

3)與xml對比

json相對XML,解析更加方便。
可讀性方面:不相上下。擴充套件性方面:xml擴充套件性很好,但json都可以做到。json速度快,但是對資料的描述性比xml差。

4)格式

①物件

無序的鍵值對集合,以“{}”包裹;每個名稱後有一個冒號;”名稱/值“對之間使用用逗號間隔。

②陣列

是值的有序 集合,以“[]”包裹,值之間以逗號分隔。

如下 表示一個數組,3個物件。

[{"StuNum":"1001","StuName":"1","Sex":"1","StuTel":"1","Sclass":"1","Academic":"1"}, {"StuNum":"1002","StuName":"2","Sex":"2","StuTel":"2","Sclass":"2","Academic":"2"}, {"StuNum":"1003","StuName":"3","Sex":"3","StuTel":"3","Sclass":"3","Academic":"3"}]

5)使用

①json字串轉換為json物件

JSONObject jsonObject = JSONObject.fromObject(jsonStr);

②json物件轉換為java物件

Person jb = (Person)JSONObject.toBean(obj,Person.class);

③java物件轉換為json字串

JSONObject json = JSONObject.fromObject(obj);//將java物件轉換為json物件
String str = json.toString();//將json物件轉換為字串

④json字串轉List

資料格式:[{},{}]

Gson gson = new Gson();
List<UserInfo> list = gson.fromJson(jsonStr, new TypeToken<List<UserInfo>>() {}.getType());     

⑤List轉json字串

        Gson gson = new Gson();
        List<UserInfo> list = new ArrayList<UserInfo>();
        String str = gson.toJson(list);

3,FastJson框架

1)介紹

FastJson是阿里巴巴開發的Json處理工具包。因為要引用第三方的包,所以使用較少。

2)優缺點

①優點

速度最快,超越任其他的Java Json parser。
功能強大,完全支援Java Bean、集合、Map、日期、Enum,支援範型,支援自省。

②缺點

fastjson嚴格安卓JavaBean的規範(詳情檢視1-(2)),實體類有一點不對就無法解析。而Gson就無此要求。

3)使用

實現反序列化:parseObject.實現序列化:toJSONString

GPeople gPeople = (GPeople)JSONObject.parseObject(jsonArr[i],GPeople.class);

4,Gson

1)介紹:

Gson是Google開發的Java API,用於轉換Java物件和Json物件。是目前使用最多的Json框架。使用方便,資料比較多,效率對於小量的資料解析來說沒有問題。

2)使用:

實現反序列化:fromJson. 實現序列化:toJson.

①基本資料型別的解析:

Gson gson = new Gson();
int i = gson.fromJson("100", int.class);              //100

②基本資料型別的生成:

Gson gson = new Gson();
String jsonNumber = gson.toJson(100);      // 100

3)封裝通用類

package util;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import entity.DraftStorgeProblemEntity;
import entity.UploadEntity;

import java.lang.reflect.Type;
import java.util.List;

/**
 * Java物件和JSON字串相互轉化工具類
 * @author luo
 * @date 2018-06-21
 */
public final class JsonUtil {

    private JsonUtil(){}

    /**
     * 物件轉換成json字串
     * @param obj
     * @return
     */
    public static String toJson(Object obj) {
        Gson gson = new Gson();
        return gson.toJson(obj);
    }

    /**
     * json字串轉成物件
     * @param str
     * @param type
     * @return
     *
     * 呼叫方法:
    UploadEntity<ProblemEntity> uploadEntity1 = JsonUtil.fromJson(jsonStr, new TypeToken<UploadEntity<ProblemEntity>>() {
    }.getType());
     */
    public static <T> T fromJson(String str, Type type) {
        Gson gson = new Gson();
        return gson.fromJson(str, type);
    }

    /**
     * json字串轉成物件
     * @param str
     * @param type
     * @return
     *
     * 呼叫方法:
    UploadEntity<ProblemEntity> uploadEntity1 = JsonUtil.fromJson(jsonStr, UploadEntity.class);
     但這樣無法解析內層的ProblemEntity。建議採用TypeToken來呼叫
     */
    public static <T> T fromJson(String str, Class<T> type) {
        Gson gson = new Gson();
        return gson.fromJson(str, type);
    }

    /**
     * 列表轉換為JsonArray
     * @param list
     * @param <T>
     * @return
     */
    public static <T> JsonArray list2JsonArray(List<T> list){

        return new Gson().toJsonTree(list, new TypeToken<List<T>>() {
        }.getType()).getAsJsonArray();
    }

    /**
     * jsonArray轉List
     * @param jsonArray
     * @param clazz
     * @param <T>
     * @return
     *
     * 使用:List<UploadEntity> list1 = (List<UploadEntity>) JsonUtil.jsonArray2List(jsonArray, UploadEntity.class);
     */
    public static <T> List<T> jsonArray2List(JsonArray jsonArray, Class<T> clazz) {

                return new Gson().fromJson(jsonArray,new TypeToken<List<T>>() {
                }.getType());
    }
    /**
     * Object轉JsonObject
     * @param obj
     * @return
     */
    public static JsonObject object2JsonObject(Object obj){

        return new Gson().toJsonTree(obj).getAsJsonObject();
    }
    /**
     * JsonString轉JsonObject
     * @param str
     * @return
     */
    public static JsonObject jsonString2JsonObject(String str){

        return new JsonParser().parse(str).getAsJsonObject();
    }
}

5,Jackson框架

1)介紹

Jackson可以輕鬆的將Java物件轉換成json物件和xml文件,同樣也可以將json、xml轉換成Java物件。比較老,比較大,效率較低。相比前兩個框架基本不怎麼用了。
是三種Json框架(包括Gson,Jackson)中最快、包最小、解碼最方便的。

Gson gson = new Gson();
int i = gson.fromJson("100", int.class);              //100

5,可以替換json的其他

1)FlatBuffer

是google的一個跨平臺序列化庫,開發這個最初是用在遊戲專案中,是二進位制儲存和二進位制讀取,不需要解析,通過fb的二進位制檔案生成物件的時間可以忽略。需要通過工具把普通model檔案生成flatBuffer格式的model檔案。flatBuffer解析library就四個檔案,程式碼很少。本地cache比較大的可以考慮通過這種方式儲存和讀取。
Json是當今全服務平臺的輕量級資料傳輸格式,Json量級輕,並且可讀性強,使用友好卻不過時,Json是語言獨立的資料格式,但Json轉換的時候卻耗費較多的時間和記憶體,Facebook嘗試過將所有的App中Json傳輸都換成使用Flatbuffers,而最終的效果遵循Android快速響應介面的16ms原則。

2)ProtocolBuffer

google出品。適用於網路API,傳輸資料會有壓縮,接收方有解析時間,同樣要生成特定的PB model檔案,一般用於傳輸資料比較大的API。
強大,靈活,但是對記憶體的消耗會比較大,並不是移動終端上的最佳選擇。

3)Nano-Proto-Buffers

基於Protocal,為移動終端做了特殊的優化,程式碼執行效率更高,記憶體使用效率更佳。