探究Android系統(tǒng)中解析JSON數(shù)據(jù)的方式
前言
喜歡在前言里講一下自己的現(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))
例如:{”name“:"zhengyi.wzy"},這就是一個(gè)最簡(jiǎn)單的json對(duì)象,對(duì)于這種數(shù)據(jù)格式,key值必須是String,而value則可以是String,Number,Object,Array等數(shù)據(jù)類(lèi)型
另一種數(shù)據(jù)格式就是有序的value的集合,這種形式被稱(chēng)為是jsonArray,數(shù)組是值(value)的有序集合。一個(gè)數(shù)組以”[“(左中括號(hào))開(kāi)始,”]“(右中括號(hào))結(jié)束。值之間使用”,“(逗號(hào))分隔
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
- Android中使用Gson解析JSON數(shù)據(jù)的兩種方法
- Android 解析JSON對(duì)象及實(shí)例說(shuō)明
- android 解析json數(shù)據(jù)格式的方法
- Android App數(shù)據(jù)格式Json解析方法和常見(jiàn)問(wèn)題
- Android M(6.x)使用OkHttp包解析和發(fā)送JSON請(qǐng)求的教程
- Android中g(shù)son、jsonobject解析JSON的方法詳解
- Android解析json數(shù)組對(duì)象的方法及Apply和數(shù)組的三個(gè)技巧
- Android利用Gson解析嵌套多層的Json的簡(jiǎn)單方法
- Android json解析及簡(jiǎn)單例子
- Android編程之json解析實(shí)例詳解
- 深入淺析Android JSON解析
- Android編程簡(jiǎn)單解析JSON格式數(shù)據(jù)的方法示例
相關(guān)文章
淺談線性表的原理及簡(jiǎn)單實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇淺談線性表的原理及簡(jiǎn)單實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06SpringBoot定制三種錯(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-12Mybatis中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-06Java超詳細(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)屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08