JSON的特點(diǎn):
1、JSON比XML的數(shù)據(jù)傳遞的有效性高;2、JSON完全獨(dú)立于編程語言;3、JSON的本質(zhì)是具有特定格式的字符串;4、易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。
JSON數(shù)據(jù)格式(JSON對(duì)象、JSON數(shù)組):
1、JSON對(duì)象:{ }
結(jié)構(gòu):{key1:value1,key2:value2,key3:value3}
key的數(shù)據(jù)類型:字符串
value的數(shù)據(jù)類型:字符串、數(shù)值、null、JSON對(duì)象、JSON數(shù)組
例子:
{" name ":" luoweichao "," blogUrl ":" luoweichao.top "}
//以key/value鍵值對(duì)形式構(gòu)建的,正確
{" name ":" luoweichao "," luoweichao.top "}
//沒有以key/value鍵值對(duì)形式構(gòu)建的,錯(cuò)誤
2、JSON數(shù)組:[ ]
結(jié)構(gòu):[value1,value2,value3]
value的數(shù)據(jù)類型:字符串、數(shù)值、null、JSON對(duì)象、JSON數(shù)組
例子:
[" 1 "," csdn ", {" name ":" luoweichao "," blogUrl ":" luoweichao.top "}? ]
//正確
[" 1 "," name ":" luoweichao "]//錯(cuò)誤
JSON解析方向:
1、將Java對(duì)象(包括集合)轉(zhuǎn)換成JSON格式字符串;(服務(wù)端)
2、將JSON格式字符串轉(zhuǎn)換成Java對(duì)象(包括集合)。(客戶端)
3、JSON和Java之間的轉(zhuǎn)換關(guān)系:JSON中的對(duì)象對(duì)應(yīng)著Java中的對(duì)象;JSON中的數(shù)組對(duì)應(yīng)這Java中的集合。
用Android原生技術(shù)解析JSON:特點(diǎn):很麻煩,對(duì)于復(fù)雜的json數(shù)據(jù)解析很容易出錯(cuò)!(不推薦使用)
1、解析JSON對(duì)象的API:JsonObjectJSONObject(String json);將Json字符串解析成Json對(duì)象;XxxgetXxx(String name) ;根據(jù)name在json對(duì)象中得到相應(yīng)的value。示例代碼:(1)獲取或創(chuàng)建JSON數(shù)據(jù)(為了方便,這里就直接創(chuàng)建了):
[java]view plaincopy
String json = "{\n" +"\t"id":2, "name":"金魚", \n" +"\t"price":12.3, \n" +"\t"imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg"\n" +"}\n";
ShopInfo shopInfo = null;
(2)解析Json對(duì)象:
[java]view plaincopy
try{JSONObject jsonObject =newJSONObject(json);// int id = jsonObject.getInt("id");int id1 = jsonObject.optInt("id");Stringname = jsonObject.optString("name"); double price = jsonObject.optDouble("price");StringimagePath = jsonObject.optString("imagePath");// 封裝Java對(duì)象? shopInfo = new ShopInfo(id1, name, price, imagePath); } catch (JSONException e) { e.printStackTrace(); }
注意:這里記得要加try_catch異常處理。(3)創(chuàng)建JavaBean類,并顯示解析后的數(shù)據(jù):
[java]view plaincopy
tv_native_last.setText(shopInfo.toString());
2、解析Json數(shù)組的API:JSONArrayJSONArray(String json);將json字符串解析成json數(shù)組;int length();得到j(luò)son數(shù)組中元素的個(gè)數(shù);XxxgetXxx(int s) ;根據(jù)下標(biāo)得到j(luò)son數(shù)組中對(duì)應(yīng)的元素?cái)?shù)據(jù)。示例代碼:(1)獲取或創(chuàng)建JSON數(shù)據(jù):
[java]view plaincopy
String json = "[\n" +" {\n" +" "id": 1,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg",\n" +" "name": "金魚1",\n" +" "price": 12.3\n" +" },\n" +" {\n" +" "id": 2,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg",\n" +" "name": "金魚2",\n" +" "price": 12.5\n" +" }\n" +"]";
(2)解析json數(shù)組:
[java]view plaincopy
try{JSONArray jsonArray =newJSONArray(json);for(inti =0; i < jsonArray.length(); i++) {? JSONObject jsonObject = jsonArray.getJSONObject(i);if(jsonObject !=null) {intid = jsonObject.optInt("id");? String name = jsonObject.optString("name");doubleprice = jsonObject.optDouble("price");? String imagePath = jsonObject.optString("imagePath");// 封裝Java對(duì)象 ShopInfo shopInfo = new ShopInfo(id, name, price, imagePath);? shops.add(shopInfo);? } } } catch (JSONException e) { e.printStackTrace();? }
(3)顯示解析后的數(shù)據(jù):
[java]view plaincopy
tv_native_last.setText(shops.toString());
到此為止,這就是用原生的技術(shù)去解析json了,至于復(fù)雜特殊的json數(shù)據(jù)怎樣去解析,也是大同小異了,一層一層解析就對(duì)了!
用Gson框架技術(shù)解析JSON:特點(diǎn):解析沒那么麻煩,代碼量簡潔,可以很方便地解析復(fù)雜的Json數(shù)據(jù),而且谷歌官方也推薦使用。先放出jar包的下載地址:https://mvnrepository.com/artifact/com.google.code.gson/gson
如過用Android Studio做開發(fā)的話,可以通過Gradle,直接添加依賴,不用下載jar包,很方便,如下:
1、用Gson解析JSON對(duì)象:(1)將gson的jar包導(dǎo)入到項(xiàng)目libs目錄下,或者直接通過Gradle添加依賴:
[java]view plaincopy
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
(2)創(chuàng)建Gson對(duì)象:[java]view plaincopy
Gson gson = new Gson();
(3)通過創(chuàng)建的Gson對(duì)象調(diào)用fromJson()方法,返回該json數(shù)據(jù)對(duì)象的Java對(duì)象;
[java]view plaincopy
ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);
注意要記得創(chuàng)建對(duì)象的JavaBean類;要求json對(duì)象中的key的名稱與Java對(duì)象的JavaBean類中的屬性名要相同,否則解析不成功!示例代碼如下:[java]view plaincopy
// 1 獲取或創(chuàng)建JSON數(shù)據(jù)String json = "{\n" +"\t"id":2, "name":"金魚", \n" +"\t"price":12.3, \n" +"\t"imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg"\n" +"}\n";
// 2 解析JSON數(shù)據(jù)? Gson gson = new Gson(); ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class); // 3 展示數(shù)據(jù)? tv_gson_last.setText(shopInfo.toString());
2、用Gson解析JSON數(shù)組:(1)(2)與上面相同,要用Gson就要先添加依賴,然后創(chuàng)建Gson對(duì)象;(3)通過創(chuàng)建的Gson對(duì)象調(diào)用fromJson()方法,返回該json數(shù)據(jù)對(duì)應(yīng)的Java集合。這里但強(qiáng)調(diào)一下:要記得創(chuàng)建對(duì)象的JavaBean類;要求json對(duì)象中的key的名稱與Java對(duì)象的JavaBean類中的屬性名要相同,否則解析不成功!
示例代碼如下:
[java]view plaincopy
// 1 獲取或創(chuàng)建JSON數(shù)據(jù)String json = "[\n" +" {\n" +" "id": 1,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg",\n" +" "name": "金魚1",\n" +" "price": 12.3\n" +" },\n" +" {\n" +" "id": 2,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg",\n" +" "name": "金魚2",\n" +" "price": 12.5\n" +" }\n" +"]";
// 2 解析JSON數(shù)據(jù)? Gson gson = new Gson(); List shops = gson.fromJson(json, new TypeToken>() { }.getType()); // 3 展示數(shù)據(jù)? tv_gson_last.setText(shops.toString());
還是那句話,復(fù)雜特殊的都是大同小異,理解了方法就沒問題了!3、Gson還可以將Java對(duì)象、Java對(duì)象的List 轉(zhuǎn)換為json字符串{};有興趣的就去研究一下哈。
用Fastjson框架技術(shù)解析JSON:特點(diǎn):Fastjson是用Java語言編寫的高性能功能完善的JSON庫。它采用了一種“假定有序、快速匹配”的算法,把JSON Parse的性能提升到極致,是目前Java語言中最快的JSON庫。Fastjson是阿里巴巴開源框架,已經(jīng)開源到github上了,地址為:https://github.com/alibaba/fastjson
在github上,我還專門留意了這個(gè),哈哈,gson和fastjson比起來,gson就是“烏龜”
要使用Fastjson,也是想Gson一樣,先導(dǎo)入jar包,或者在Gradle中添加依賴:
[java]view plaincopy
compile 'com.alibaba:fastjson:1.1.55.android'
添加好依賴后就可以使用Fastjson了!1、用Fastjson解析JSON對(duì)象:利用Fastjson的JSON調(diào)用parseObject()方法,獲取轉(zhuǎn)換后的Java對(duì)象。注意要記得創(chuàng)建對(duì)象的JavaBean類;要求json對(duì)象中的key的名稱與Java對(duì)象的JavaBean類中的屬性名要相同,否則解析不成功!示例代碼:
[java]view plaincopy
// 1 獲取或創(chuàng)建json數(shù)據(jù)String json = "{\n" +"\t"id":2, "name":"金魚", \n" +"\t"price":12.3, \n" +"\t"imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg"\n" +"}\n";
// 2 解析JSON數(shù)據(jù)? ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class); // 3 顯示數(shù)據(jù)? tv_fastjson_last.setText(shopInfo.toString());
2.用Fastjson解析JSON數(shù)組:利用Fastjson的JSON調(diào)用parseArray()方法,獲取轉(zhuǎn)換后的Java集合。這里但強(qiáng)調(diào)一下:要記得創(chuàng)建對(duì)象的JavaBean類;要求json對(duì)象中的key的名稱與Java對(duì)象的JavaBean類中的屬性名要相同,否則解析不成功!示例代碼:
[java]view plaincopy
// 1 獲取或創(chuàng)建json數(shù)據(jù)String json = "[\n" +" {\n" +" "id": 1,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg",\n" +" "name": "金魚1",\n" +" "price": 12.3\n" +" },\n" +" {\n" +" "id": 2,\n" +" "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg",\n" +" "name": "金魚2",\n" +" "price": 12.5\n" +" }\n" +"]";
// 2 解析JSON數(shù)據(jù)? List shopInfos = JSON.parseArray(json, ShopInfo.class); // 3 顯示數(shù)據(jù)? tv_fastjson_last.setText(shopInfos.toString());
3、同樣Fastjson也可以將Java對(duì)象、Java對(duì)象的List 轉(zhuǎn)換為json字符串{};有興趣的就去研究一下哈。到此為止,算是比較詳細(xì)地介紹了json解析了。
前言:
最近為了統(tǒng)一項(xiàng)目中使用的框架,發(fā)現(xiàn)項(xiàng)目中用到了兩種json解析框架,他們就是當(dāng)今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,為了廢除其中一個(gè)所以來個(gè)性能和使用的大比拼。
FastJson簡介:Fastjson是一個(gè)Java語言編寫的JSON處理器,由阿里巴巴公司開發(fā)。
當(dāng)前版本: fastjson-1.2.14.jar
下載地址http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.14/
對(duì)象轉(zhuǎn)化成json:
/**
* 對(duì)象轉(zhuǎn)化為json fastjson 使用方式
*
* @return
*/publicstaticStringobjectToJsonForFastJson(Objectobject) {if(object ==null) {return"";? ? }try{returnJSON.toJSONString(object);? ? }catch(JSONException e) {? ? }catch(Exception e) {? ? }return"";}
json轉(zhuǎn)化成對(duì)象:
/**
* json轉(zhuǎn)化為對(duì)象? fastjson 使用方式
*
* @return
*/
public static T jsonToObjectForFastJson(String jsonData, Class clazz) {
if (TextUtils.isEmpty(jsonData)) {
return null;
}
try {
return parseObject(jsonData, clazz);
} catch (Exception e) {
}
return null;
}
json轉(zhuǎn)化成List:
/**
*json轉(zhuǎn)化為List? fastjson 使用方式
*/
public static List jsonToListForFastJson(String jsonData) {
if (TextUtils.isEmpty(jsonData)) {
return null;
}
List arrayList = null;
try {
arrayList =? parseObject(jsonData,new TypeReference(){});
} catch (Exception e) {
}
return arrayList;
}
json轉(zhuǎn)化這Map:
/**
*json轉(zhuǎn)化為Map? fastjson 使用方式
*/publicstaticMapjsonToMapForFastJson(StringjsonData){if(TextUtils.isEmpty(jsonData)) {returnnull;? ? }Mapmap =null;try{? ? ? ? map =? parseObject(jsonData,newTypeReference(){});? ? }catch(Exception e){? ? ? ? e.printStackTrace();? ? }returnmap;}
Gson 簡介:Gson由谷歌研發(fā),可以把Java對(duì)象轉(zhuǎn)換成JSON,也可以把JSON字符串轉(zhuǎn)換成一個(gè)相等的Java對(duì)象。Gson支持任意復(fù)雜Java對(duì)象包括沒有源代碼的對(duì)象。
當(dāng)前版本2.40
使用方式? build.gradle 中配置 compile 'com.google.code.gson:gson:2.4'
對(duì)象轉(zhuǎn)化json:
/**
* 對(duì)象轉(zhuǎn)化為json對(duì)象? Gson 使用方式
*
* @return
*/
public static String objectToJsonForGson(Object object) {
if (object == null) {
return "";
}
Gson gson;
try {
gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
return gson.toJson(object);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
json轉(zhuǎn)化成對(duì)象:
/**
* json轉(zhuǎn)化為對(duì)象? Gson 使用方式
*
* @return
*/
publicstatic T jsonToObjectForGson(String jsonData,Classclazz){if(TextUtils.isEmpty(jsonData)) {returnnull;? ? }? ? T finalResult =null;try{? ? ? ? Gson gson =newGsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();? ? ? ? finalResult = gson.fromJson(jsonData, clazz);? ? }catch(Exceptione) {? ? ? ? e.printStackTrace();? ? }returnfinalResult;}
json轉(zhuǎn)化成List:
/**
*json轉(zhuǎn)化為集合? Gson 使用方式
*/
public static List jsonToListForForGson(String jsonData) {
if (TextUtils.isEmpty(jsonData)) {
return null;
}
List list = null;
try {
Type listType = new TypeToken() {
}.getType();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
list = gson.fromJson(jsonData, listType);
} catch (Exception e) {
}
return list;
}
json轉(zhuǎn)化為Map:
/**
*json轉(zhuǎn)化為Map? fastjson 使用方式
*/
public static Map jsonToMapForForGson(String jsonData){
if (TextUtils.isEmpty(jsonData)) {
return null;
}
Map map = null;
try {
Type listType = new TypeToken() {
}.getType();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
map = gson.fromJson(jsonData, listType);
} catch (Exception e) {
}
return map;
}
測試性能程序:
第一步:首先創(chuàng)建一個(gè)實(shí)體對(duì)象Person
public class Person {
privateString name;//姓名privateintage;//年齡publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age = age;}publicStringgetName(){returnname;}publicvoidsetName(String name){this.name = name;}
}
第二部:創(chuàng)建一個(gè)測試集合:
List personList=newArrayList<>();inttestMaxCount=1000;//測試的最大數(shù)據(jù)條數(shù) //添加測試數(shù)據(jù)for(inti=0;i
分別執(zhí)行兩者的轉(zhuǎn)化和解析代碼:
//FastJson生成json數(shù)據(jù)longstart=System.currentTimeMillis();? ? String jsonData=JsonUtils.objectToJsonForFastJson(personList);longend=System.currentTimeMillis();? ? Log.e("MainActivity","FastJson生成json數(shù)據(jù) cost time---->"+(end-start));//FastJson解析json數(shù)據(jù)start=System.currentTimeMillis();? ? List tempPersons=JsonUtils.jsonToListForFastJson(jsonData);? ? end=System.currentTimeMillis();? ? Log.e("MainActivity","FastJson解析json數(shù)據(jù) cost time---->"+(end-start));//Gson生成json數(shù)據(jù)start=System.currentTimeMillis();? ? jsonData=JsonUtils.objectToJsonForGson(personList);? ? end=System.currentTimeMillis();? ? Log.e("MainActivity","Gson生成json數(shù)據(jù) cost time---->"+(end-start));//Gson解析json數(shù)據(jù)start=System.currentTimeMillis();? ? List tempPersons1=JsonUtils.jsonToListForForGson(jsonData);? ? end=System.currentTimeMillis();? ? Log.e("MainActivity","Gson解析json數(shù)據(jù) cost time---->"+(end-start));
重點(diǎn)看執(zhí)行結(jié)果:單位毫秒(執(zhí)行時(shí)間)
兩者轉(zhuǎn)換性能對(duì)比:1000條? ? 10000條? 100000條? 200000條
fastJson :? ? ? ? ? 45? ? ? ? ? 289? ? ? ? 4010? ? ? ? 8396
Gson? ? :? ? ? ? ? 60? ? ? ? ? 724? ? ? ? 4071? ? ? ? 8803
兩者解析性能對(duì)比:1000條? ? 10000條? 100000條? 200000條
fastJson :? ? ? ? ? 55? ? ? ? ? 552? ? ? ? 3826? ? ? ? 8638
Gson? ? :? ? ? ? ? 45? ? ? ? ? 465? ? ? ? 5942? ? ? ? 9668
總結(jié):在數(shù)據(jù)量比較小的情況下,兩者性能相差無幾,在數(shù)據(jù)量比較大的情況下FastJson還是有優(yōu)勢的。
插曲:為了項(xiàng)目省事,本人把FastJson給刪除了,結(jié)果項(xiàng)目中遺留了一些代碼編寫不規(guī)范的情況,比如userId 寫成了useid 但是json數(shù)據(jù)中返回的是userId,之前用FastJson一直正常這才發(fā)現(xiàn)原來FastJson對(duì)實(shí)體屬性是忽略大小寫的,真是一個(gè)神奇的東西。
作者:gogoingmonkey
鏈接:http://www.lxweimin.com/p/501f7a9b4c39
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。