欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android學(xué)習(xí)筆記45之gson解析json

 更新時(shí)間:2015年12月23日 09:49:35   作者:依舊淡然  
JSON即JavaScript Object Natation,是一種輕量級(jí)的數(shù)據(jù)交換格式,采用完全獨(dú)立于語(yǔ)言的文本格式,為Web開(kāi)發(fā)提供了一種理想的數(shù)據(jù)交換格式。通過(guò)本篇文章給大家介紹Android學(xué)習(xí)筆記45之gson解析json的相關(guān)內(nèi)容,對(duì)android gson解析json相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧

JSON即JavaScript Object Natation, 是一種輕量級(jí)的數(shù)據(jù)交換格式,采用完全獨(dú)立于語(yǔ)言的文本格式,為Web應(yīng)用開(kāi)發(fā)提供了一種理想的數(shù)據(jù)交換格式。

JSON對(duì)象:

JSON中對(duì)象(Object)以"{"開(kāi)始, 以"}"結(jié)束. 對(duì)象中的每一個(gè)item都是一個(gè)key-value對(duì), 表現(xiàn)為"key:value"的形式, key-value對(duì)之間使用逗號(hào)分隔. 如:{"name":"coolxing", "age"=24, "male":true, "address":{"street":"huiLongGuan", "city":"beijing", "country":"china"}}. JSON對(duì)象的key只能是string類(lèi)型的, 而value可以是string, number, false, true, null, Object對(duì)象甚至是array數(shù)組, 也就是說(shuō)可以存在嵌套的情況.

JSON數(shù)組:

JSON數(shù)組(array)以"["開(kāi)始, 以"]"結(jié)束, 數(shù)組中的每一個(gè)元素可以是string, number, false, true, null, Object對(duì)象甚至是array數(shù)組, 數(shù)組間的元素使用逗號(hào)分隔. 如["coolxing", 24, {"street":"huiLongGuan", "city":"beijing", "country":"china"}].

  在上一篇博文《Android學(xué)習(xí)筆記44:JSON數(shù)據(jù)解析》中,我們使用基本的JSON API完成了在服務(wù)器端創(chuàng)建JSON數(shù)據(jù),以及在Android客戶(hù)端對(duì)JSON數(shù)據(jù)進(jìn)行解析。 

  其實(shí),要?jiǎng)?chuàng)建和解析JSON數(shù)據(jù),也可以使用GSON來(lái)完成。GSON是Google提供的用來(lái)在Java對(duì)象和JSON數(shù)據(jù)之間進(jìn)行映射的Java類(lèi)庫(kù)。使用GSON,可以很容易的將一串JSON數(shù)據(jù)轉(zhuǎn)換為一個(gè)Java對(duì)象,或是將一個(gè)Java對(duì)象轉(zhuǎn)換為相應(yīng)的JSON數(shù)據(jù)。 

1.GSON的兩個(gè)重要方法

  在GSON的API中,提供了兩個(gè)重要的方法:toJson()和fromJson()方法。其中,toJson()方法用來(lái)實(shí)現(xiàn)將Java對(duì)象轉(zhuǎn)換為相應(yīng)的JSON數(shù)據(jù),fromJson()方法則用來(lái)實(shí)現(xiàn)將JSON數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的Java對(duì)象。

1.1 toJson()方法

  toJson()方法用于將Java對(duì)象轉(zhuǎn)換為相應(yīng)的JSON數(shù)據(jù),主要有以下幾種形式:

 ?。?)String toJson(JsonElement jsonElement);

 ?。?)String toJson(Object src);

 ?。?)String toJson(Object src, Type typeOfSrc);

  其中,方法(1)用于將JsonElement對(duì)象(可以是JsonObject、JsonArray等)轉(zhuǎn)換成JSON數(shù)據(jù);方法(2)用于將指定的Object對(duì)象序列化成相應(yīng)的JSON數(shù)據(jù);方法(3)用于將指定的Object對(duì)象(可以包括泛型類(lèi)型)序列化成相應(yīng)的JSON數(shù)據(jù)。

1.2 fromJson()方法

  fromJson()方法用于將JSON數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的Java對(duì)象,主要有以下幾種形式:

 ?。?)<T> T fromJson(JsonElement json, Class<T> classOfT);

  (2)<T> T fromJson(JsonElement json, Type typeOfT);

 ?。?)<T> T fromJson(JsonReader reader, Type typeOfT);

  (4)<T> T fromJson(Reader reader, Class<T> classOfT);

 ?。?)<T> T fromJson(Reader reader, Type typeOfT);

  (6)<T> T fromJson(String json, Class<T> classOfT);

 ?。?)<T> T fromJson(String json, Type typeOfT);

  以上的方法用于將不同形式的JSON數(shù)據(jù)解析成Java對(duì)象。

2.在服務(wù)器端生成JSON數(shù)據(jù)

  要使用GSON技術(shù)在服務(wù)器端生成JSON數(shù)據(jù),首先需要完成以下兩個(gè)準(zhǔn)備工作。

 ?。?)使用MyEclipse創(chuàng)建了一個(gè)Web Project,這里我將該工程命名為了“GsonDemoProject”,用來(lái)模擬服務(wù)器端的Web服務(wù)。 

  (2)往該工程中導(dǎo)入GSON的API數(shù)據(jù)包gson-2.2.1.jar。 

  然后,我們便可以在該工程中創(chuàng)建一個(gè)JsonTools工具類(lèi),并實(shí)現(xiàn)靜態(tài)方法createJsonString(),在該方法中通過(guò)使用GSON技術(shù)來(lái)生成JSON數(shù)據(jù)。該方法的具體實(shí)現(xiàn)如下。 

public class JsonTools {
    /*
     * Function : 生成JSON字符串
     * Param   :  value  想要轉(zhuǎn)換成JSON字符串的Object對(duì)象
     * Retuen  : JSON字符串
     * Author  : 博客園-依舊淡然
     */
    public static String createJsonString(Object value) {
     Gson gson = new Gson();
     String string = gson.toJson(value);
     return string;
    }  
   }

  可以看到,這個(gè)方法的具體實(shí)現(xiàn)非常簡(jiǎn)單,首先創(chuàng)建一個(gè)Gson對(duì)象,然后通過(guò)調(diào)用Gson對(duì)象的toJson()方法,將傳進(jìn)來(lái)的value(任意的Java對(duì)象)轉(zhuǎn)換成JSON字符串即可。

  通過(guò)使用該方法,我們可以很方便的將任意Java對(duì)象傳遞進(jìn)來(lái),并將其轉(zhuǎn)化成JSON數(shù)據(jù)。和上一篇博文中一樣,我們可以在JsonService類(lèi)中,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的獲取Person對(duì)象列表的方法,具體如下:

 /*
  * Function :  獲取Person對(duì)象列表
  * Author  :  博客園-依舊淡然
  */
  public List<Person> getListPerson() {
   List<Person> list = new ArrayList<Person>();
   Person person = new Person(, "jack", );
   Person person = new Person(, "rose", );
   Person person = new Person(, "bob", );
   list.add(person);
   list.add(person);
   list.add(person);
   return list;
  } 

  在該方法中,我們向List列表中加入了3個(gè)Person對(duì)象,每個(gè)Person對(duì)象具有id(int)、name(String)和age(int)三個(gè)屬性。

  最后,我們還需要?jiǎng)?chuàng)建一個(gè)繼承自HttpServlet的JsonAction類(lèi),并實(shí)現(xiàn)其中的doPost()方法,用來(lái)響應(yīng)客戶(hù)端對(duì)服務(wù)器的請(qǐng)求。具體如下:

public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
   response.setContentType("text/html;charset=utf-");
   request.setCharacterEncoding("utf-");
   response.setCharacterEncoding("utf-");
   PrintWriter out = response.getWriter();
   List<Person> listPerson = jsonService.getListPerson();
   String str = null;
   String action_flag = request.getParameter("action_flag");
   if(action_flag.equals("persons") {
    str = JsonTools.createJsonString(listPerson);
   }
   out.println(str);
   out.flush();
   out.close();
  }

  在該方法中,我們通過(guò)調(diào)用JsonService類(lèi)中的getListPerson()方法獲得了Person對(duì)象列表listPerson,并將其傳入JsonTools.createJsonString()方法中,生成了Person對(duì)象列表的JSON數(shù)據(jù)。將該工程發(fā)布到Tomcat上,使用瀏覽器訪問(wèn)該Web工程,可以看到如圖1所示的界面,Person對(duì)象列表被成功的轉(zhuǎn)化成了JSON數(shù)據(jù)。


圖1 生成的JSON數(shù)據(jù)

 3.在客戶(hù)端解析JSON數(shù)據(jù)

  在Android工程中,我們可以通過(guò)HttpURLConnection接口訪問(wèn)圖1所示的URL來(lái)獲得服務(wù)器上的JSON數(shù)據(jù)。

  得到JSON數(shù)據(jù)之后,便可以通過(guò)使用前面提到的fromJson()方法,將圖1 所示的JSON數(shù)據(jù)還原成對(duì)應(yīng)的Person對(duì)象列表了。當(dāng)然了,因?yàn)檫@里使用到了GSON,同樣需要向Android工程中導(dǎo)入gson-2.2.1.jar包。具體的實(shí)現(xiàn)方法如下。

 /*
  * Function : 解析JSON數(shù)據(jù),還原成Person對(duì)象列表
  * Param  : jsonString   從服務(wù)器獲得的Json數(shù)據(jù)
  * Retuen  : Person對(duì)象列表
  * Author : 博客園-依舊淡然
  */
  public static List<Person> getListPerson(String jsonString) {
   List<Person> list = new ArrayList<Person>();
   Gson gson = new Gson();
   list = gson.fromJson(jsonString, new TypeToken<List<Person>>(){}.getType());
   return list;
  }

  可以看到,使用GSON解析JSON數(shù)據(jù)的代碼實(shí)現(xiàn)也非常簡(jiǎn)單。其中,TypeToken是GSON提供的數(shù)據(jù)類(lèi)型轉(zhuǎn)換器,支持多種數(shù)據(jù)集合類(lèi)型轉(zhuǎn)換,其反射機(jī)制可以實(shí)現(xiàn)將解析出來(lái)的Java對(duì)象映射到對(duì)應(yīng)的數(shù)據(jù)集合中。

  在本實(shí)例中,同樣點(diǎn)擊Button按鈕向服務(wù)器發(fā)送獲取JSON數(shù)據(jù)的請(qǐng)求,從服務(wù)器獲得JSON數(shù)據(jù)后,使用以上的代碼完成對(duì)JSON數(shù)據(jù)的解析,最后將解析得到的Person對(duì)象依次顯示在TextView控件中。程序運(yùn)行的結(jié)果如圖2所示。

 

圖2 運(yùn)行結(jié)果

以上內(nèi)容是小編給大家分享的Android學(xué)習(xí)筆記45之gson解析json的全部敘述,希望大家喜歡。

相關(guān)文章

最新評(píng)論