一、概述
目前主流數據交換格式就是 Json和Xml,而 Json 格式使用範圍可能更加的廣並且可拓展性更強一些。
本文章將對 Json 數據交換格式通過 Gson 和 FastJson 來實現在 Android 端的高效解析。
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,用於數據轉換傳輸。
通用於PHP, Java, C++, C#, Python等編程語言數據交換傳輸。
易於人閱讀和編寫,同時也易於機器解析和生成。
基本結構:對象、數組。
Gson 的簡介和特點:
Gson 是 Google 提供的用來在 Java 對象和 JSON 數據之間進行映射的 Java 類庫。
可以將一個 JSON 字符串轉成一個 Java 對象,或者反過來。
• 快速、高效
• 代碼量少、簡潔
• 面向對象
• 數據傳遞和解析方便- 基本用法:
• 定義實體類
• 根據需要可以將JSON 生成單個實體或列表實體集合 - 代碼演示:
使用 Gson 解析 JsonObject
使用 Gson 解析 JsonArray
使用 Gson 將實體轉爲JSON 數據
- 基本用法:
FastJson 簡介和特點:
FastJson 是一個性能很好的 Java 語言實現的 JSON 解析器和生成器,來自阿里巴巴的工程師開發。
具有極快的性能,超越任其他的Java Json parser。
• 快速FAST (比其它任何基於Java的解析器和生成器更快,包括jackson)
• 強大(支持普通JDK類包括任意Java Bean Class、 Collection、 Map、 Date或enum )
• 零依賴(沒有依賴其它任何類庫除了JDK)
• 支持註解、支持全類型序列化- 基本用法:
• 定義實體類
• 根據需要可以將JSON 生成單個實體或列表實體集合 - 代碼演示:
使用 FastJson 解析 JsonObject
使用 FastJson 解析 JsonArray
使用 FastJson 將實體轉爲JSON 數據
- 基本用法:
二、實例解析
1. Gson的基本用法
Gson有兩個重要的方法,一個是 tojson()
,另一個是 fromjson()
。
tojson()
:將bean裏面的內容轉換爲json內容。
User user=new User("zhangsan",19);
Gson gson=new Gson();
System.out.println(gson.toJson(user));
//打印結果是{"name":"zhangsan","age":19}
當然它還可以承擔一些複雜的操作,比如通過集合插入一組數據。
List<User> list = new LinkedList<User>();
User u1 =new User("zhangsan",19);
list.add(u1);
User u2=new User("lisi",25);
list.add(u2);
Gson gson = new Gson();
System.out.println(gson.toJson(list));
//打印結果是[{"name":"zhangsan","age":19},{"name":"lisi","age":25}]
//注意,對於Json而言,[]代表數組,{}代表一個對象
當然它還可以實現更復雜的對象,比如在一個Json對象中再嵌套一個Json對象。
fromjson()
:從我們的Json對象封裝出一個一個的bean對象。
User u = new User();
Gson gson = new Gson();
u = gson.fromJson("{name:'zhangsan',age:12}", user.class);
System.out.println(u.getName()+" "+u.getAge());
//打印結果是zhangsan 12
如果你的Json裏面不止一個對象,那麼你就得使用一個集合來裝.
我們這裏模擬一個list來裝的例子,在使用list裝的過程中我們會使用到一個工具類 TypeToken
.
通過它我們可以 獲取一個泛型的數據類型,使用方法十分簡單,TypeToken<泛型>(){}.gettype()
即可,返回一個Type
類型,這就是fromjson()
所需要的type類型,來自於reflect包
。
User user = new User();
Gson gson = new Gson();
String str = "[{name:'zhangsan',age:12},{name:'lisi',age:13}]";
// 獲取一個泛型的數據類型
Type type = new TypeToken<List<user>>(){}.getType();
List<user> list = gson.fromJson(str , type);
for(user u : list){
System.out.println(u.getName() + " " + u.getAge());
}
//打印結果是zhangsan 12
//lisi 13
2. Gson的實例解析
下面這段 json 代碼(時間不一樣獲得的代碼可能不一樣)是豆瓣書籍的一個 api :
https://api.douban.com/v2/book/1220562
{
"rating": {
"max": 10,
"numRaters": 345,
"average": "7.0",
"min": 0
},
"subtitle": "",
"author": [
"[日] 片山恭一"
],
"pubdate": "2005-1",
"tags": [
{
"count": 133,
"name": "片山恭一",
"title": "片山恭一"
},
{
"count": 62,
"name": "日本",
"title": "日本"
},
{
"count": 60,
"name": "日本文學",
"title": "日本文學"
},
{
"count": 38,
"name": "小說",
"title": "小說"
},
{
"count": 32,
"name": "滿月之夜白鯨現",
"title": "滿月之夜白鯨現"
},
{
"count": 15,
"name": "愛情",
"title": "愛情"
},
{
"count": 8,
"name": "純愛",
"title": "純愛"
},
{
"count": 8,
"name": "外國文學",
"title": "外國文學"
}
],
"origin_title": "",
"image": "https://img1.doubanio.com/mpic/s1747553.jpg",
"binding": "平裝",
"translator": [
"豫人"
],
"catalog": "
",
"pages": "180",
"images": {
"small": "https://img1.doubanio.com/spic/s1747553.jpg",
"large": "https://img1.doubanio.com/lpic/s1747553.jpg",
"medium": "https://img1.doubanio.com/mpic/s1747553.jpg"
},
"alt": "http://book.douban.com/subject/1220562/",
"id": "1220562",
"publisher": "青島出版社",
"isbn10": "7543632608",
"isbn13": "9787543632608",
"title": "滿月之夜白鯨現",
"url": "http://api.douban.com/v2/book/1220562",
"alt_title": "",
"author_intro": "",
"summary": "那一年,是聽莫扎特、釣鱸魚和家庭破裂的一年。說到家庭破裂,母親怪自己當初沒有找到好男人,父親則認爲當時是被狐狸精迷住了眼,失常的是母親,但出問題的是父親……。",
"price": "15.00元"
}
下面我們在Android進行解析。
Project中總共有三個類:MainActivity.java
, Book.java
, Tag.java
public class MainActivity extends Activity {
private String url = "https://api.douban.com/v2/book/1220562";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
}
private void getData() {
StringRequest request = new StringRequest(url, new Listener<String>() {
@Override
public void onResponse(String arg0) {
Log.i("info", arg0);
dealData(arg0);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
// TODO Auto-generated method stub
}
});
// 將請求加入隊列
new Volley().newRequestQueue(getApplicationContext()).add(request);
}
private void dealData(String result) {
Gson gson = new Gson();
Book book = gson.fromJson(result, Book.class);
Log.i("info", book.getTitle() + ":" + book.getPublisher() + ":"
+ book.getTags().size()); // 這裏打印了tags的個數
}
}
// Log日誌結果是 滿月之夜白鯨現:青島出版社:8
// 對象的變量名要與json中的相對應,這裏只是選取了json中的幾個“變量”進行解析
public class Book {
private String title;
private String publisher;
private String summary;
private ArrayList<Tag> tags;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public ArrayList<Tag> getTags() {
return tags;
}
public void setTags(ArrayList<Tag> tags) {
this.tags = tags;
}
}
public class Tag {
private String count;
private String name;
private String title;
public String getCount() {
return count;
}
public void setCount(String count) {
this.count = count;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
3. FastJson的基本用法
1) Fastjson中的經常調用的方法
// 把JSON文本parse爲JSONObject或者JSONArray
public static final Object parse(String text);
// 把JSON文本parse成JSONObject
public static final JSONObject parseObject(String text);
// 把JSON文本parse爲JavaBean
public static final T parseObject(String text, Class clazz);
// 把JSON文本parse成JSONArray
public static final JSONArray parseArray(String text);
//把JSON文本parse成JavaBean集合
public static final List parseArray(String text, Class clazz);
// 將JavaBean序列化爲JSON文本
public static final String toJSONString(Object object);
// 將JavaBean序列化爲帶格式的JSON文本
public static final String toJSONString(Object object, boolean prettyFormat);
// 將JavaBean轉換爲JSONObject或者JSONArray。
public static final Object toJSON(Object javaObject);
2) 如何使用FastJson
- 服務器端使用Fastjson將數據轉換成json字符串
主要使用的函數如下:
public static String createJsonString(Object value)
{
String alibabaJson = JSON.toJSONString(value);//此處轉換
return alibabaJson;
}
- 客戶端將從服務器端獲取到的json字符串轉換爲相應的javaBean,
下面給以寫核心的函數例子,供參考:
public static String getJsonContent(String urlStr) {
try {
// 獲取HttpURLConnection連接對象
URL url = new URL(urlStr);
HttpURLConnection httpConn = (HttpURLConnection) url
.openConnection();
// 設置連接屬性
httpConn.setConnectTimeout(3000);
httpConn.setDoInput(true);
httpConn.setRequestMethod("GET");
// 獲取相應碼
int respCode = httpConn.getResponseCode();
if (respCode == 200) {
return ConvertStream2Json(httpConn.getInputStream());
}
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
private static String ConvertStream2Json(InputStream inputStream) throws IOException {
String jsonStr = "";
// ByteArrayOutputStream相當於內存輸出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
// 將輸入流轉移到內存輸出流中
while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, len);
}
// 將內存流轉換爲字符串
jsonStr = new String(out.toByteArray());
return jsonStr;
}
3) 使用泛型獲取javaBean(核心函數)
public static T getPerson(String jsonString, Class cls) {
T t = null;
t = JSON.parseObject(jsonString, cls);
return t;
}
public static List getPersons(String jsonString, Class cls) {
List list = new ArrayList();
list = JSON.parseArray(jsonString, cls);
return list;
}
4. FastJson的實例解析
只需在“Gson的實例解析中”修改dealData(String result)
方法即可。
private void dealData(String result) {
Book book = JSON.parseObject(result, Book.class);
List<Book> books = JSON.parseObject(result,
new TypeReference<List<Book>>() {
});
Book book1 = new Book();
book1.setTitle("biaoti");
Book book2 = new Book();
book2.setTitle("biaoti");
Book book3 = new Book();
book2.setTitle("biaoti");
List<Book> list = new ArrayList<Book>();
list.add(book1);
list.add(book2);
list.add(book3);
JSON.toJSON(list);
Log.i("info", book.getTitle() + ":" + book.getPublisher() + ":"
+ book.getTags().size());
}
三、Gson的知識點補充
1. toJson()方法
toJson()
方法用於將Java對象轉換爲相應的JSON數據,主要有以下幾種形式:
(1)String toJson(JsonElement jsonElement);
(2)String toJson(Object src);
(3)String toJson(Object src, Type typeOfSrc);
其中,方法(1)用於將JsonElement對象(可以是JsonObject、JsonArray等)轉換成JSON數據;
方法(2)用於將指定的Object對象序列化成相應的JSON數據;
方法(3)用於將指定的Object對象(可以包括泛型類型)序列化成相應的JSON數據。
2. fromJson()方法
fromJson()
方法用於將JSON數據轉換爲相應的Java對象,主要有以下幾種形式:
(1)<T> T fromJson(JsonElement json, Class<T> classOfT);
(2)<T> T fromJson(JsonElement json, Type typeOfT);
(3)<T> T fromJson(JsonReader reader, Type typeOfT);
(4)<T> T fromJson(Reader reader, Class<T> classOfT);
(5)<T> T fromJson(Reader reader, Type typeOfT);
(6)<T> T fromJson(String json, Class<T> classOfT);
(7)<T> T fromJson(String json, Type typeOfT);
以上的方法用於將不同形式的JSON數據解析成Java對象。