摘要:Json數據在安卓開發過程當中是很是常見的,在請求服務器端數據的時候,服務器端返回的無非就是三種類型:HTML,XML,JSON。因此學習JSON對安卓程序員來講是很是重要的。javascript
JSON:JavaScript Object Notation。顧名思義,JSON數據是源自於JavaScript,學習過JavaScript(如下簡稱JS)的人都知道,咱們在JS腳本里面建立對象時,都是以鍵值對的形式編寫的。例如,咱們在JS裏面建立一個Json對象時是這麼定義的:java
var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
很容易看出,屬性之間是經過逗號分隔開,鍵與值之間是經過雙引號分隔開,而JSON數據也是如此。程序員
json一共有兩種數據結構。json
一種是以 (key/value)對形式存在的無序的jsonObject對象。對象使用大括號括起來,屬性之間使用逗號分隔開。數組
例如:{"name": "jack"}, 這就是一個最簡單的json對象,對於這種數據格式,key值必需要是string類型,而對於value,則能夠是string、number、object、array等數據類型。服務器
另外一種數據格式就是有序的value的集合,這種形式被稱爲是JsonArray。數組是值的有序集合,值與值之間使用逗號分隔開,集合用中括號括起來。數據結構
例如咱們要建立如下類型的Jjson數據:ide
{"person":{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}}
/** * 使用JsonObject和JsonArray建立JSON對象 */ public void makeJson() { try { JSONObject object = new JSONObject(); JSONObject person = new JSONObject(); //名字 person.put("name", "zhangsan"); //電話 JSONArray phone = new JSONArray(); phone.put("123").put("456"); person.put("phone", phone); //地址 person.put("address", "guangdong"); object.put("person", person); Log.i("JSON_LOG", object.toString()); } catch (JSONException e) { e.printStackTrace(); } }
輸出結果學習
/** * 經過JsonStringer建立JSON對象 */ public void makeJsonStringer() { try { JSONStringer jsonText = new JSONStringer(); // 首先是{,對象開始。object和endObject必須配對使用 jsonText.object(); jsonText.key("person"); jsonText.object(); jsonText.key("name"); jsonText.value("zhangsan"); jsonText.key("phone"); // 鍵phone的值是數組。array和endArray必須配對使用 jsonText.array(); jsonText.value("123").value("456"); jsonText.endArray(); jsonText.key("address"); jsonText.value("Guangdong"); jsonText.endObject(); jsonText.endObject(); Log.i("JSON_LOG", jsonText.toString()); } catch (JSONException ex) { throw new RuntimeException(ex); } }
輸出結果:this
{"person":{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}}
解析代碼
/** * JSON解析 * @param json * @return */ public static String JsonToString(String json) { Person person = new Person(); try { //獲取到整個Json數據 JSONObject object = new JSONObject(json); //解析最外層,得到person鍵對應的object值 JSONObject personObject = object.getJSONObject("person"); //解析object值裏面的每個屬性 person.setName(personObject.getString("name")); //屬性值是數組,則使用JSONArray獲取 JSONArray phoneArray = personObject.getJSONArray("phone"); List<String> phone = new ArrayList<>(); for (int i = 0; i < phoneArray.length(); i++) { phone.add((String) phoneArray.get(i)); } person.setPhone(phone); person.setAddress(personObject.getString("address")); } catch (JSONException e) { e.printStackTrace(); } return person.toString(); }
結果
{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}
這麼解析:
/** * 解析單個對象的JSON數據 * @param json * @return */ public static String JsonParse(String json) { Person person = new Person(); try { JSONObject personObject = new JSONObject(json); //解析object值裏面的每個屬性 person.setName(personObject.getString("name")); //屬性值是數組,則使用JSONArray獲取 JSONArray phoneArray = personObject.getJSONArray("phone"); List<String> phone = new ArrayList<>(); for (int i = 0; i < phoneArray.length(); i++) { phone.add((String) phoneArray.get(i)); } person.setPhone(phone); person.setAddress(personObject.getString("address")); } catch (JSONException e) { e.printStackTrace(); } return person.toString(); }
["123", "456", "789"];
解析方法:
/** * 解析數組型的JSON數據 * @param json * @return */ public static List<String> JsonParseToArray(String json){ List<String> list = new ArrayList<>(); try { JSONArray array = new JSONArray(json); for (int i=0; i<array.length(); i++){ list.add((String) array.get(i)); } } catch (JSONException e) { e.printStackTrace(); } return list; }
解析總結
JSON解析無非就是經過JSONObject和JSONArray不斷地對數據進行解析,歸根結底每一種數據都是能夠分解爲以上的三種最基本的解析,因此你們只要掌握好JSONObject和JSONArray,即使再複雜的數據類型,你們也能夠解析得駕輕就熟。
GSON是Google開發的開源的JAVA API,能夠用於JSON的建立和JSON的解析。下面對GSON作一個最基本的介紹。更多瞭解http://sites.google.com/site/gson/
首先須要下載GSON的jar包,自行度娘。
其次,咱們使用GSON來建立JSON和解析JSON都要有相對應的JavaBean,因此GSON能夠幫助咱們更加簡便地實現Bean和JSON的轉換。
如下例子咱們都是用Person類的JavaBean:
public class Person { private String name; private List<String> phone; private String address; public Person() { } public Person(String name, List<String> phone, String address) { this.name = name; this.phone = phone; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<String> getPhone() { return phone; } public void setPhone(List<String> phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", phone=" + phone + ", address='" + address + '\'' + '}'; } }
/** * GSON轉換爲JSON * * @return json */ public String beanToJson() { //賦值給一個person實例 List<String> phone = new ArrayList<>(); phone.add("123"); phone.add("456"); Person person = new Person("jack", phone, "Guangzhou"); //實例化GSON Gson gson = new Gson(); //調用gson.toJson將Bean轉爲JSON String json = gson.toJson(person); return json; }
/** * JSON轉換爲Bean * @param json * @return */ public String jsonToBean(String json) { Person person = new Person(); Gson gson = new Gson(); //調用gson.fromJson將json轉爲bean person = gson.fromJson(json, Person.class); return person.toString(); }