【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,為移動終端做了特殊的優化,程式碼執行效率更高,記憶體使用效率更佳。