咱們以前已經掌握了 XML 格式數據的解析方式,那麼接下來咱們要去學習一下如何解析 JSON 格式的數據,在學習以前,咱們先將這二者作一個簡單的比較。編程
XML與JSON的對比:
- JSON和XML的數據可讀性基本相同
- JSON和XML一樣擁有豐富的解析手段
- JSON相對於XML來說,數據的體積小
- JSON與JavaScript的交互更加方便
- JSON對數據的描述性比XML較差
- JSON的速度要遠遠快於XML
總之,比起 XML, JSON 的主要優點在於它的體積更小,在網絡上傳輸的時候能夠更省流量。但缺點在於,它的語義性較差,看起來不如 XML 直觀。json
就像協議同樣,JSON 也是有一套規範的,畢竟服務端和客戶端雙方通常來說都是經過 JSON 字符串來傳遞數據的。數組
它的語法規則以下:網絡
- 數據在「名稱/值」對中;
- 數據由逗號分隔;
- 花括號保存對象;
- 方括號保存數組;
[ { "id":"1","name":"WGH","age":"18" }, { "id":"2","name":"WillFlow","age":"16" } ]
咱們除了解析JSON還能夠本身拼接JSON,固然若是你本身拼了一個JSON字符串又不知道對不對, 能夠用校驗工具進行校驗,好比:點擊這裏,而後把本身拼接的JSON字符串貼上去,就能夠校驗正確與否了。app
這些JSON解析類的API都存在於org.json包下,而咱們用到的類有下面這些:框架
private static final String JSON = "[\n" + " {\"id\":\"1\",\"version\":\"1.5\",\"name\":\"Apple\"},\n" + " {\"id\":\"2\",\"version\":\"1.6\",\"name\":\"WillFlow\"},\n" + " {\"id\":\"3\",\"version\":\"1.7\",\"name\":\"WGH\"}\n" + "]";
這樣咱們就把 JSON 格式的數據準備好了,下面就開始在 Android 程序中解析這些數據。ide
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); parseJSONWithJSONObject(JSON); } private void parseJSONWithJSONObject(String jsonData) { try { JSONArray jsonArray = new JSONArray(jsonData); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); String id = jsonObject.getString("id"); String name = jsonObject.getString("name"); String version = jsonObject.getString("version"); Log.i(TAG, "id : " + id); Log.i(TAG, "name : " + name); Log.i(TAG, "version : " + version); Log.i(TAG, "————————————————————"); } } catch (Exception e) { e.printStackTrace(); } }
能夠看到,解析 JSON 的代碼真的是很是簡單,因爲咱們定義的是一個 JSON 數組,所以這裏首先是將數據傳入到了一個 JSONArray 對象中,而後循環遍歷這個 JSONArray,從中取出的每個元素都是一個 JSONObject 對象,每一個 JSONObject 對象中又會包含 id、 name 和 version 這些數據。接下來只須要調用 getString() 方法將這些數據取出,並打印出來便可。工具
如何你認爲使用 JSONObject 來解析 JSON 數據已經很是簡單了,那你就太容易知足了。谷歌提供的 GSON 開源庫可讓解析 JSON 數據的工做簡單到讓你不敢想象的地步,那咱們確定是不能錯過這個學習機會的。學習
dependencies { ...... compile 'com.google.code.gson:gson:2.8.1' }
這時候GSON框架就加載好了,咱們須要手動同步一下。this
完成以後重啓 Android Studio 便可。
那麼 GSON 庫到底是神奇在哪裏呢?其實它主要就是能夠將一段 JSON格式的字符串自動映射成一個對象,從而不須要咱們再手動去編寫代碼進行解析了,好比說一段 JSON 格式的數據以下所示:
{"name":"Tom","age":20}
那咱們就能夠定義一個 Person 類,並加入 name 和 age 這兩個字段,而後只需簡單地調用以下代碼就能夠將 JSON 數據自動解析成一個 Person 對象了:
Gson gson = new Gson(); Person person = gson.fromJson(jsonData, Person.class);
若是須要解析的是一段 JSON 數組會稍微麻煩一點,咱們須要藉助 TypeToken 將指望解析成的數據類型傳入到 fromJson() 方法中,以下所示:
List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());
基本的用法就是這樣,下面就讓咱們來真正地嘗試一下。
[ {"id":"1","version":"1.5","name":"Apple"}, {"id":"2","version":"1.6","name":"WillFlow"}, {"id":"3","version":"1.7","name":"WGH"} ]
/** * Created by : WGH. */ public class AppBean { }
/** * Created by : WGH. */ public class AppBean { /** * id : 1 * version : 1.5 * name : Apple */ private String id; private String version; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
這是一個包含了id、 name 和 version 這三個字段的數據類,而且成員變量和JSON原始數據的Key值徹底相同(這點尤其重要,這是採用GSON解析的必須)。
private void parseByGSON(String jsonData) { Gson gson = new Gson(); List<AppBean> appList = gson.fromJson(jsonData, new TypeToken<List<AppBean>>() {}.getType()); for (AppBean app : appList) { Log.i(TAG, "id : " + app.getId()); Log.i(TAG, "name : " + app.getName()); Log.i(TAG, "version : " + app.getVersion()); Log.i(TAG, "————————————————————"); } }
而後調用輸出便可。
這樣咱們就就把 XML 和 JSON 這兩種數據格式最經常使用的幾種解析方法都學習完了,在網絡數據的解析方面,咱們已經成功畢業了。