編輯:關於Android編程
摘要:Json數據在安卓開發過程中是非常常見的,在請求服務器端數據的時候,服務器端返回的無非就是三種類型:HTML,XML,JSON。所以學習JSON對安卓程序員來說是非常重要的。
JSON:JavaScript Object Notation。顧名思義,JSON數據是源自於JavaScript,學習過JavaScript(以下簡稱JS)的人都知道,我們在JS腳本裡面創建對象時,都是以鍵值對的形式編寫的。例如,我們在JS裡面創建一個Json對象時是這麼定義的:
var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
很容易看出,屬性之間是通過逗號分隔開,鍵與值之間是通過雙引號分隔開,而JSON數據也是如此。
json一共有兩種數據結構。
一種是以 (key/value)對形式存在的無序的jsonObject對象。對象使用大括號括起來,屬性之間使用逗號分隔開。

例如:{"name": "jack"}, 這就是一個最簡單的json對象,對於這種數據格式,key值必須要是string類型,而對於value,則可以是string、number、object、array等數據類型。
另一種數據格式就是有序的value的集合,這種形式被稱為是JsonArray。數組是值的有序集合,值與值之間使用逗號分隔開,集合用中括號括起來。

例如我們要創建以下類型的Jjson數據:
{"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);
}
}
輸出結果:

{"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 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 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 JsonParseToArray(String json){
List list = new ArrayList<>();
try {
JSONArray array = new JSONArray(json);
for (int i=0; i
解析總結
JSON解析無非就是通過JSONObject和JSONArray不斷地對數據進行解析,歸根結底每一種數據都是可以分解為以上的三種最基本的解析,所以大家只要掌握好JSONObject和JSONArray,即便再復雜的數據類型,大家也可以解析得得心應手。
GSON
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 phone;
private String address;
public Person() {
}
public Person(String name, List 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 getPhone() {
return phone;
}
public void setPhone(List 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 + '\'' +
'}';
}
}
Bean轉換為JSON
/**
* GSON轉換為JSON
*
* @return json
*/
public String beanToJson() {
//賦值給一個person實例
List 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
/**
* 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();
}
Android 斷點續傳原理以及實現
Android 斷點續傳原理以及實現0. 前言在Android開發中,斷點續傳聽起來挺容易,在下載一個文件時點擊暫停任務暫停,點擊開始會繼續下載文件。但是真正
Android動態改變布局
遇到這麼個需求,先看圖: 其實是一個軟件的登錄界面,初始是第一個圖的樣子,當軟鍵盤彈出後變為第二個圖的樣子,因為登錄界面有用戶名、密碼、登錄按鈕,不這樣的
Android_SVG概述及生成使用SVG詳解
1.效果圖 2.SVG-Path路徑 下面的命令可用於路徑數據: M = moveto L = lineto H = horizontal lineto V
Android NDK使用libjpeg解析JPEG圖片,並顯示到SurfaceView上
SurfaceView大概是谷歌提供給開發者最吸引人的的組件了,原因是SurfaceView的界面刷新允許在非UI線程中更新,正因為此,很多頻繁更新界面的應用,如視頻播放