探究Android系統(tǒng)中解析JSON數(shù)據(jù)的方式
前言
喜歡在前言里講一下自己的現(xiàn)狀,或許能有共鳴的同學(xué),更多的是留給自己一個(gè)紀(jì)念,幾個(gè)月或者幾年再回來看的時(shí)候還是會很有感慨。今天說說語言,json這種數(shù)據(jù)格式之前我做服務(wù)器端的時(shí)候天天接觸,天真的以為json的世界里只有php的json_encode和json_decode,今天當(dāng)我做客戶端的時(shí)候,竟然將近一個(gè)多小時(shí)才搞定json的解析。這里我不是抨擊php好壞,只是想說多學(xué)點(diǎn)東西,看看你不熟悉的領(lǐng)域,方能開闊自己的視野,方能知道天外有天,方能知道當(dāng)初你看不上的工作其實(shí)你也不一定能很好的完成,扯多了,回來講解json
什么是json
json(Javascript Object Natation)是一種輕量級的數(shù)據(jù)交換格式,相比xml這種數(shù)據(jù)交換格式來說,json相對解析更加簡單一些,因此客戶端和服務(wù)器的數(shù)據(jù)交換格式往往通過json進(jìn)行交換
json一共有兩種數(shù)據(jù)結(jié)構(gòu),一種是以(key/value)對形式存在的無序的jsonObject對象,一個(gè)對象以“{”(左花括號)開始,“}”(右花括號)結(jié)束。每個(gè)“名稱”后跟一個(gè)“:”(冒號); “名稱/值”對之間使用“,”(逗號)

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

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

Android中json相關(guān)解析類
android的json解析部分都在包org.json下,主要有以下幾個(gè)類:
JSONObject
這是系統(tǒng)中有關(guān)JSON定義的基本單元,其包含一對(key/value)數(shù)值
它對外部(External:應(yīng)用toString()方法輸出的數(shù)值)調(diào)用的響應(yīng)體現(xiàn)為一個(gè)標(biāo)準(zhǔn)的字符串(例如:{“json”: “Hello, World”},最外被大括號包裹,其中的key和value被冒號”:”分隔)。其對于內(nèi)部(Internal)行為的操作格式略微,例如:初始化一個(gè)JSONObject實(shí)例,引用內(nèi)部的put()方法添加數(shù)值:new JSONObject().put(“json”, “Hello, World!”),在key和value之間是以逗號”,”分隔
value的類型包括: JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL
有兩種不同的取值方式:
get():在確定key存在的條件下使用,否則當(dāng)無法檢索到相關(guān)key時(shí),將會拋出一個(gè)Exception異常信息
opt():這個(gè)方法相對比較靈活,當(dāng)無法獲取所指定數(shù)值時(shí),將會返回一個(gè)默認(rèn)值,并不會拋出異常(個(gè)人推薦使用這個(gè)方法)
JSONArray
它代表一組有序的數(shù)值。將其轉(zhuǎn)換為String輸出(toString)所表現(xiàn)的形式是用方括號包裹,數(shù)值以逗號”,”分隔(例如:[”Alibaba“,”Baidu“,“Tecent”])
這個(gè)類的內(nèi)部同樣具有查詢行為,get()和opt()兩種方法都可以通過index索引返回指定的數(shù)值,put()方法用來添加或者替換數(shù)值
同樣JSONArray的value類型可以包括: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/, 我們可以開啟一個(gè)線程發(fā)起http請求,獲取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對象及實(shí)例說明
- android 解析json數(shù)據(jù)格式的方法
- Android App數(shù)據(jù)格式Json解析方法和常見問題
- Android M(6.x)使用OkHttp包解析和發(fā)送JSON請求的教程
- Android中g(shù)son、jsonobject解析JSON的方法詳解
- Android解析json數(shù)組對象的方法及Apply和數(shù)組的三個(gè)技巧
- Android利用Gson解析嵌套多層的Json的簡單方法
- Android json解析及簡單例子
- Android編程之json解析實(shí)例詳解
- 深入淺析Android JSON解析
- Android編程簡單解析JSON格式數(shù)據(jù)的方法示例
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之KMP算法詳解以及代碼實(shí)現(xiàn)
KMP算法是一種改進(jìn)的字符串匹配算法,核心是利用之前的匹配失敗時(shí)留下的信息,選擇最長匹配長度直接滑動,從而減少匹配次數(shù)。本文主要介紹了KMP算法的原理與實(shí)現(xiàn),需要的可以參考一下2022-12-12
java swagger ui 添加header請求頭參數(shù)的方法
今天小編就為大家分享一篇java swagger ui 添加header請求頭參數(shù)的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Java實(shí)現(xiàn)排球比賽計(jì)分系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)排球比賽計(jì)分系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

