探究Android系統(tǒng)中解析JSON數(shù)據(jù)的方式
前言
喜歡在前言里講一下自己的現(xiàn)狀,或許能有共鳴的同學(xué),更多的是留給自己一個紀(jì)念,幾個月或者幾年再回來看的時候還是會很有感慨。今天說說語言,json這種數(shù)據(jù)格式之前我做服務(wù)器端的時候天天接觸,天真的以為json的世界里只有php的json_encode和json_decode,今天當(dāng)我做客戶端的時候,竟然將近一個多小時才搞定json的解析。這里我不是抨擊php好壞,只是想說多學(xué)點東西,看看你不熟悉的領(lǐng)域,方能開闊自己的視野,方能知道天外有天,方能知道當(dāng)初你看不上的工作其實你也不一定能很好的完成,扯多了,回來講解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對象,一個對象以“{”(左花括號)開始,“}”(右花括號)結(jié)束。每個“名稱”后跟一個“:”(冒號); “名稱/值”對之間使用“,”(逗號)

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

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

Android中json相關(guān)解析類
android的json解析部分都在包org.json下,主要有以下幾個類:
JSONObject
這是系統(tǒng)中有關(guān)JSON定義的基本單元,其包含一對(key/value)數(shù)值
它對外部(External:應(yīng)用toString()方法輸出的數(shù)值)調(diào)用的響應(yīng)體現(xiàn)為一個標(biāo)準(zhǔn)的字符串(例如:{“json”: “Hello, World”},最外被大括號包裹,其中的key和value被冒號”:”分隔)。其對于內(nèi)部(Internal)行為的操作格式略微,例如:初始化一個JSONObject實例,引用內(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時,將會拋出一個Exception異常信息
opt():這個方法相對比較靈活,當(dāng)無法獲取所指定數(shù)值時,將會返回一個默認(rèn)值,并不會拋出異常(個人推薦使用這個方法)
JSONArray
它代表一組有序的數(shù)值。將其轉(zhuǎn)換為String輸出(toString)所表現(xiàn)的形式是用方括號包裹,數(shù)值以逗號”,”分隔(例如:[”Alibaba“,”Baidu“,“Tecent”])
這個類的內(nèi)部同樣具有查詢行為,get()和opt()兩種方法都可以通過index索引返回指定的數(shù)值,put()方法用來添加或者替換數(shù)值
同樣JSONArray的value類型可以包括:JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL
Android解析實例
客戶端一般從服務(wù)器獲得都是字符串,直接new一個JSONObject即可,參考程序如下
獲取json字符串
這個網(wǎng)址提供了json字符串:http://api.androidhive.info/contacts/, 我們可以開啟一個線程發(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對象及實例說明
- 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ù)組的三個技巧
- Android利用Gson解析嵌套多層的Json的簡單方法
- Android json解析及簡單例子
- Android編程之json解析實例詳解
- 深入淺析Android JSON解析
- Android編程簡單解析JSON格式數(shù)據(jù)的方法示例
相關(guān)文章
SpringBoot定制三種錯誤頁面及錯誤數(shù)據(jù)方法示例
Spring Boot提供的默認(rèn)異常處理機制通常并不一定適合我們實際的業(yè)務(wù)場景,因此,我們通常會根據(jù)自身的需要對Spring Boot全局異常進(jìn)行統(tǒng)一定制,例如定制錯誤頁面,定制錯誤數(shù)據(jù)等。本文主要介紹了SpringBoot三種自定義錯誤頁面的實現(xiàn),快來學(xué)習(xí)吧2021-12-12
Mybatis中Mapper標(biāo)簽總結(jié)大全
這篇文章主要介紹了Mybatis中Mapper標(biāo)簽總結(jié)大全,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
使用JAXBContext 設(shè)置xml節(jié)點屬性
這篇文章主要介紹了使用JAXBContext 設(shè)置xml節(jié)點屬性的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

