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

探究Android系統(tǒng)中解析JSON數(shù)據(jù)的方式

 更新時(shí)間:2015年07月31日 15:37:20   作者:zinss26914  
這篇文章主要介紹了探究Android系統(tǒng)中解析JSON數(shù)據(jù)的方式,文中講到了使用Java代碼實(shí)現(xiàn)的處理JSON的一些主要方法,需要的朋友可以參考下

前言
喜歡在前言里講一下自己的現(xiàn)狀,或許能有共鳴的同學(xué),更多的是留給自己一個(gè)紀(jì)念,幾個(gè)月或者幾年再回來(lái)看的時(shí)候還是會(huì)很有感慨。今天說(shuō)說(shuō)語(yǔ)言,json這種數(shù)據(jù)格式之前我做服務(wù)器端的時(shí)候天天接觸,天真的以為json的世界里只有php的json_encode和json_decode,今天當(dāng)我做客戶端的時(shí)候,竟然將近一個(gè)多小時(shí)才搞定json的解析。這里我不是抨擊php好壞,只是想說(shuō)多學(xué)點(diǎn)東西,看看你不熟悉的領(lǐng)域,方能開(kāi)闊自己的視野,方能知道天外有天,方能知道當(dāng)初你看不上的工作其實(shí)你也不一定能很好的完成,扯多了,回來(lái)講解json


什么是json
json(Javascript Object Natation)是一種輕量級(jí)的數(shù)據(jù)交換格式,相比xml這種數(shù)據(jù)交換格式來(lái)說(shuō),json相對(duì)解析更加簡(jiǎn)單一些,因此客戶端和服務(wù)器的數(shù)據(jù)交換格式往往通過(guò)json進(jìn)行交換

json一共有兩種數(shù)據(jù)結(jié)構(gòu),一種是以(key/value)對(duì)形式存在的無(wú)序的jsonObject對(duì)象,一個(gè)對(duì)象以“{”(左花括號(hào))開(kāi)始,“}”(右花括號(hào))結(jié)束。每個(gè)“名稱(chēng)”后跟一個(gè)“:”(冒號(hào)); “名稱(chēng)/值”對(duì)之間使用“,”(逗號(hào))

2015731153703523.png (690×150)

例如:{”name“:"zhengyi.wzy"},這就是一個(gè)最簡(jiǎn)單的json對(duì)象,對(duì)于這種數(shù)據(jù)格式,key值必須是String,而value則可以是String,Number,Object,Array等數(shù)據(jù)類(lèi)型

2015731153726475.png (691×325)

另一種數(shù)據(jù)格式就是有序的value的集合,這種形式被稱(chēng)為是jsonArray,數(shù)組是值(value)的有序集合。一個(gè)數(shù)組以”[“(左中括號(hào))開(kāi)始,”]“(右中括號(hào))結(jié)束。值之間使用”,“(逗號(hào))分隔

2015731153747720.png (686×156)

Android中json相關(guān)解析類(lèi)
android的json解析部分都在包org.json下,主要有以下幾個(gè)類(lèi):

JSONObject
這是系統(tǒng)中有關(guān)JSON定義的基本單元,其包含一對(duì)(key/value)數(shù)值

它對(duì)外部(External:應(yīng)用toString()方法輸出的數(shù)值)調(diào)用的響應(yīng)體現(xiàn)為一個(gè)標(biāo)準(zhǔn)的字符串(例如:{“json”: “Hello, World”},最外被大括號(hào)包裹,其中的key和value被冒號(hào)”:”分隔)。其對(duì)于內(nèi)部(Internal)行為的操作格式略微,例如:初始化一個(gè)JSONObject實(shí)例,引用內(nèi)部的put()方法添加數(shù)值:new JSONObject().put(“json”, “Hello, World!”),在key和value之間是以逗號(hào)”,”分隔

value的類(lèi)型包括: JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL

有兩種不同的取值方式:

    get():在確定key存在的條件下使用,否則當(dāng)無(wú)法檢索到相關(guān)key時(shí),將會(huì)拋出一個(gè)Exception異常信息
    opt():這個(gè)方法相對(duì)比較靈活,當(dāng)無(wú)法獲取所指定數(shù)值時(shí),將會(huì)返回一個(gè)默認(rèn)值,并不會(huì)拋出異常(個(gè)人推薦使用這個(gè)方法)


JSONArray
它代表一組有序的數(shù)值。將其轉(zhuǎn)換為String輸出(toString)所表現(xiàn)的形式是用方括號(hào)包裹,數(shù)值以逗號(hào)”,”分隔(例如:[”Alibaba“,”Baidu“,“Tecent”])

這個(gè)類(lèi)的內(nèi)部同樣具有查詢(xún)行為,get()和opt()兩種方法都可以通過(guò)index索引返回指定的數(shù)值,put()方法用來(lái)添加或者替換數(shù)值

同樣JSONArray的value類(lèi)型可以包括:JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL


Android解析實(shí)例
客戶端一般從服務(wù)器獲得都是字符串,直接new一個(gè)JSONObject即可,參考程序如下

獲取json字符串
這個(gè)網(wǎng)址提供了json字符串:http://api.androidhive.info/contacts/, 我們可以開(kāi)啟一個(gè)線程發(fā)起http請(qǐng)求,獲取json字符串,參考代碼如下:

  

 private String getJsonByNetwork() { 
    // You can get json by this url 
    final String url = "http://api.androidhive.info/contacts/"; 
    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(url); 
   
    InputStream inputStream = null; 
    String result = null; 
   
    try { 
      HttpResponse response = httpClient.execute(httpGet); 
      inputStream = response.getEntity().getContent(); 
   
      // Json is UTF-8 by default 
      BufferedReader reader = new BufferedReader(new InputStreamReader( 
          inputStream, "UTF-8")); 
      StringBuilder sb = new StringBuilder(); 
      String tmp = null; 
   
      while ((tmp = reader.readLine()) != null) { 
        sb.append(tmp); 
      } 
   
      result = sb.toString(); 
    } catch (Exception e) { 
      try { 
        if (inputStream != null) { 
          inputStream.close(); 
        } 
      } catch (IOException se) { 
      } 
    } 
   
    return result; 
  } 

解析json字符串
解析json字符串的步驟一般如下所示:

(1) 創(chuàng)建JSONObject:

  // Create a JSONObject 
  JSONObject jsonObject = new JSONObject(result); 


(2) 獲取JSONArray,遍歷JSONArray數(shù)組

  // To get a specific JSONArray 
  JSONArray jsonArray = jsonObject.getJSONArray("contacts"); 
   
  // To get items from the array 
  for (int i = 0; i < jsonArray.length(); i ++) { 
    // TODO:Traverse the jsonarray 
  } 


(3) 獲取JSONObject

  // Create a JSONObject 
  JSONObject jsonObject = new JSONObject(result); 
   
  // To get a specific JSONArray 
  JSONArray jsonArray = jsonObject.getJSONArray("contacts"); 
   
  // To get items from the array 
  for (int i = 0; i < jsonArray.length(); i++) { 
    // To get a specific JSONObject 
    JSONObject oneObject = jsonArray.getJSONObject(i); 
  } 


(4)獲取特定字符串

  // Create a JSONObject 
  JSONObject jsonObject = new JSONObject(result); 
   
  // To get a specific JSONArray 
  JSONArray jsonArray = jsonObject.getJSONArray("contacts"); 
   
  // To get items from the array 
  for (int i = 0; i < jsonArray.length(); i++) { 
    // To get a specific JSONObject 
    JSONObject oneObject = jsonArray.getJSONObject(i); 
   
    // To get a specific string 
    String id = oneObject.getString("id"); 
    String name = oneObject.getString("name"); 
   
    Log.e("wzy", "id is:" + id + ", name is " + name); 
  } 


解析結(jié)果:

  03-05 10:26:08.690: E/wzy(26401): id is:c200, name is Ravi Tamada 
  03-05 10:26:08.690: E/wzy(26401): id is:c201, name is Johnny Depp 
  03-05 10:26:08.690: E/wzy(26401): id is:c202, name is Leonardo Dicaprio 
  03-05 10:26:08.690: E/wzy(26401): id is:c203, name is John Wayne 
  03-05 10:26:08.691: E/wzy(26401): id is:c204, name is Angelina Jolie 
  03-05 10:26:08.691: E/wzy(26401): id is:c205, name is Dido 
  03-05 10:26:08.691: E/wzy(26401): id is:c206, name is Adele 
  03-05 10:26:08.692: E/wzy(26401): id is:c207, name is Hugh Jackman 
  03-05 10:26:08.693: E/wzy(26401): id is:c208, name is Will Smith 
  03-05 10:26:08.693: E/wzy(26401): id is:c209, name is Clint Eastwood 
  03-05 10:26:08.694: E/wzy(26401): id is:c2010, name is Barack Obama 
  03-05 10:26:08.694: E/wzy(26401): id is:c2011, name is Kate Winslet 
  03-05 10:26:08.695: E/wzy(26401): id is:c2012, name is Eminem 

相關(guān)文章

  • Java基礎(chǔ)之java泛型通配符詳解

    Java基礎(chǔ)之java泛型通配符詳解

    Java 泛型(generics)是 JDK 5 中引入的一個(gè)新特性, 泛型提供了編譯時(shí)類(lèi)型安全檢測(cè)機(jī)制,該機(jī)制允許開(kāi)發(fā)者在編譯時(shí)檢測(cè)到非法的類(lèi)型,今天通過(guò)本文給大家介紹java泛型通配符的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-07-07
  • 淺談線性表的原理及簡(jiǎn)單實(shí)現(xiàn)方法

    淺談線性表的原理及簡(jiǎn)單實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇淺談線性表的原理及簡(jiǎn)單實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • SpringBoot定制三種錯(cuò)誤頁(yè)面及錯(cuò)誤數(shù)據(jù)方法示例

    SpringBoot定制三種錯(cuò)誤頁(yè)面及錯(cuò)誤數(shù)據(jù)方法示例

    Spring Boot提供的默認(rèn)異常處理機(jī)制通常并不一定適合我們實(shí)際的業(yè)務(wù)場(chǎng)景,因此,我們通常會(huì)根據(jù)自身的需要對(duì)Spring Boot全局異常進(jìn)行統(tǒng)一定制,例如定制錯(cuò)誤頁(yè)面,定制錯(cuò)誤數(shù)據(jù)等。本文主要介紹了SpringBoot三種自定義錯(cuò)誤頁(yè)面的實(shí)現(xiàn),快來(lái)學(xué)習(xí)吧
    2021-12-12
  • Mybatis中Mapper標(biāo)簽總結(jié)大全

    Mybatis中Mapper標(biāo)簽總結(jié)大全

    這篇文章主要介紹了Mybatis中Mapper標(biāo)簽總結(jié)大全,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java二叉樹(shù)的四種遍歷(遞歸與非遞歸)

    Java二叉樹(shù)的四種遍歷(遞歸與非遞歸)

    這篇文章小編給大家分享的是Java二叉樹(shù)的四種遍歷,主要是遞歸與非遞歸,下面文章加u來(lái)詳細(xì)介紹,感興趣的小伙伴一起來(lái)學(xué)習(xí)吧
    2021-10-10
  • Java動(dòng)態(tài)代理分析及理解

    Java動(dòng)態(tài)代理分析及理解

    這篇文章主要介紹了Java動(dòng)態(tài)代理分析及理解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • java 遍歷Map的幾種方法總結(jié)

    java 遍歷Map的幾種方法總結(jié)

    這篇文章主要介紹了java 遍歷Map的四種方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10
  • JPA之QueryDSL-JPA使用指南

    JPA之QueryDSL-JPA使用指南

    Springdata-JPA是對(duì)JPA使用的封裝,Querydsl-JPA也是基于各種ORM之上的一個(gè)通用查詢(xún)框架,使用它的API類(lèi)庫(kù)可以寫(xiě)出Java代碼的sql,下面就來(lái)介紹一下JPA之QueryDSL-JPA使用指南
    2023-11-11
  • Java超詳細(xì)分析繼承與重寫(xiě)的特點(diǎn)

    Java超詳細(xì)分析繼承與重寫(xiě)的特點(diǎn)

    繼承是Java面向?qū)ο缶幊讨械囊婚T(mén)。繼承是子類(lèi)繼承父類(lèi)的特征和行為,或者是繼承父類(lèi)得方法,使的子類(lèi)具有父類(lèi)得的特性和行為。重寫(xiě)是子類(lèi)對(duì)父類(lèi)的允許訪問(wèn)的方法實(shí)行的過(guò)程進(jìn)行重新編寫(xiě),返回值和形參都不能改變。就是對(duì)原本的父類(lèi)進(jìn)行重新編寫(xiě),但是外部接口不能被重寫(xiě)
    2022-05-05
  • 使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性

    使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性

    這篇文章主要介紹了使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論