JSON是JavaScript Object Notation的縮寫,可見JSON來源於JavaScript。JSON數據是一系列鍵值對的集合。
JSON和XML的比較
JSON比XML體積小
JSON和JavaScript交互更加方便
JSON對數據的描述性沒有XML好
JSON的速度要遠遠大於XML
JSON的解析要比XML的解析要方便
JSON已經被大多數開發人員所接受,在網絡數據的傳輸當中應用非常廣泛
下面的代碼就是一個JSON:
[plain] {
"phone" : ["12345678", "87654321"], // 數組
"name" : "tianjiefeng", // 字符串
"age" : 100, // 數值
"address" : { "country" : "china", "province" : "jiangsu" }, // JSON對象
"married" : false // 佈爾值
}
JSON是以key/value的形式存在的,key是Strng類型的,value的類型可以是一個數組,可以是一個字符串,可以是一個數值,也可以是一個佈爾值,甚至可以是一個JSON對象
一、JSONObject的創建
我們先來看一個Demo,把上面的JSON對象創建出來,並且寫入存儲卡文件
既然要寫入存儲卡,那麼就必須在AndroidManifest.xml中加入一下權限
[html]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
接著在JSONCreateDemoActivity.java裡面編寫如下代碼:
[java]
package com.tianjf;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
public class JSONCreateDemoActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 不存在不操作
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// 返回到程序的被調用出
return;
}
// 將JSON對象寫入存儲卡
writeJSONObjectToSdCard(createJSONObject());
}
// 創建以下的JSON對象
// {
// "phone" : ["12345678", "87654321"], // 數組
// "name" : "tianjiefeng", // 字符串
// "age" : 100, // 數值
// "address" : { "country" : "china", "province" : "jiangsu" }, // JSON對象
// "married" : false // 佈爾值
// }
private JSONObject createJSONObject() {
// 最外層是{},也就是一個JSONObject對象
JSONObject person = new JSONObject();
try {
// 第1個value是[ ],也就是一個JSONArray對象
JSONArray phone = new JSONArray();
phone.put("12345678");
phone.put("87654321");
person.put("phone", phone);
// 第2個value一個字符串
person.put("name", "tianjiefeng");
// 第3個value一個字符串數值
person.put("age", 100);
// 第4個value一個JSONObject對象
JSONObject address = new JSONObject();
address.put("country", "china");
address.put("province", "jiangsu");
person.put("address", address);
// 第5個value一個佈爾值
person.put("married", false);
} catch (JSONException e) {
e.printStackTrace();
}
return person;
}
/**
* 將JSON對象寫入存儲卡
*
* @param person
* @throws FileNotFoundException
*/
private void writeJSONObjectToSdCard(JSONObject person) {
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "json"
+ File.separator + "json.txt");
// 文件夾不存在的話,就創建文件夾
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
// 寫入內存卡
PrintStream outputStream = null;
try {
outputStream = new PrintStream(new FileOutputStream(file));
outputStream.print(person.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}
}
運行一下,打開File Explorer視圖,打開mnt – sdcard – json目錄,將裡面的json.txt導出到計算機裡面,就可以看到JSON對象以字符串的形式成功寫入到瞭json.txt文件中
二、JSONObject的解析
直接將字符串轉化為JSONObject對象來解析的Demo
[java]
package com.tianjf;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class JSONParseDemoActivity extends Activity {
private static final String JSONString = "{" + "\"phone\":[\"12345678\",\"87654321\"],"
+ "\"name\":\"tianjiefeng\"," + "\"age\":100,"
+ "\"address\":{\"country\":\"china\",\"province\":\"jiangsu\"},"
+ "\"married\":false" + "}";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 解析得到一個Map對象
Map<String, Object> personMap = parseJSONString(JSONString);
Log.d("debug",
"phone:" + personMap.get("phone") + "\n" + "name:" + personMap.get("name") + "\n"
+ "age:" + personMap.get("age") + "\n" + "address:"
+ personMap.get("address") + "\n" + "married:" + personMap.get("married"));
}
/**
* JSON解析
*
* @param JSONString
* @return
*/
private Map<String, Object> parseJSONString(String JSONString) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
// 直接把JSON字符串轉化為一個JSONObject對象
JSONObject person = new JSONObject(JSONString);
// 第1個鍵值對
resultMap.put("phone", person.getJSONArray("phone").toString());
// 第2個鍵值對
resultMap.put("name", person.getString("name"));
// 第3個鍵值對
resultMap.put("age", person.getInt("age"));
// 第4個鍵值對
resultMap.put("address", person.getJSONObject("address").toString());
// 第5個鍵值對
resultMap.put("married", person.getBoolean("married"));
} catch (JSONException e) {
e.printStackTrace();
}
return resultMap;
}
}
運行之後打印出來的Log如下
用JsonReader來讀取JSON字符串的內容
打開Android幫助文檔找到JsonReader,會發現Since: API Level 11(3.0),也就是說3.0之前的SDK是沒有JsonReader的。如果要對應3.0之前的版本,可以到Google的網站上去下載gson的jar包(URL:http://code.google.com/p/google-gson/downloads/list)。jar包導入項目的流程如下:
新建libs文件夾,把下載的jar包添加到libs文件夾中
右鍵gson-1.6.jar –> Build Path –> Add to Build Path(add操作之後就會看到Package視圖下的Referenced Libraries下多瞭個gson-1.6.jar,說明jar包添加成功)
添加好瞭jar包,我們就可以使用JsonReader瞭。具體代碼如下
JSONUtils.java
[java]
package com.tianjf;
import java.io.StringReader;
import com.google.gson.stream.JsonReader;
public class JSONUtils {
public void parseJson(String jsonData) {
try {
// 如果需要解析JSON數據,首要要生成一個JsonReader對象
JsonReader reader = new JsonReader(new StringReader(jsonData));
// 開始解析數組
reader.beginArray();
// 判斷數組裡面還有沒下一個JSONObject對象
while (reader.hasNext()) {
// 開始解析對象
reader.beginObject();
// 判斷當前JSONObject對象裡面還有沒下一個鍵值對
while (reader.hasNext()) {
// 取出當前鍵值對的key
String tagName = reader.nextName();
// 取出key所對應的value
if (tagName.equals("name")) {
System.out.println("name—>" + reader.nextString());
} else if (tagName.equals("age")) {
System.out.println("age—>" + reader.nextInt());
}
}
// 結束解析對象
reader.endObject();
}
// 結束解析數組
reader.endArray();
} catch (Exception e) {
e.printStackTrace();
}
}
}
JSONParseDemoActivity.java
[java]
package com.tianjf;
import android.app.Activity;
import android.os.Bundle;
public class JSONParseDemoActivity extends Activity {
private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
JSONUtils jsonUtils = new JSONUtils();
jsonUtils.parseJson(JSONString);
}
}
這個例子是解析[{"name":"Michael","age":20},{"name":"Mike","age":21}]這個JSON字符串
先分析一下這個JSON字符串的結構:一個JSONArray裡面有兩個JSONObject
再分析一下JsonReader解析這個JSON字符串的流程:
遇到【[】,開始解析數組(reader.beginArray())
遇到【{】,開始解析對象(reader.beginObject())
遇到【"】,開始解析第一個鍵值對
遇到【"】,開始解析第二個鍵值對
遇到【}】,結束解析對象(reader.endObject())
遇到【{】,開始解析對象(reader.beginObject())
遇到【"】,開始解析第一個鍵值對
遇到【"】,開始解析第二個鍵值對
遇到【}】,結束解析對象(reader.endObject())
遇到【]】,結束解析數組(reader.endArray())
Gson類的fromJson方法自動解析並自動得到一個Entity對象,代碼如下
User.java
[java]
package com.tianjf;
public class User {
private String name ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
JSONUtils.java
[java]
package com.tianjf;
import com.google.gson.Gson;
public class JSONUtils {
public void parseUserFromJson(String jsonData) {
Gson gson = new Gson();
// Gson的fromJson方法是一 一對應的關系,自動將JSON的數據匹配到User對象中
User user = gson.fromJson(jsonData, User.class);
System.out.println("name—>" + user.getName());
System.out.println("age—->" + user.getAge());
}
}
JSONParseDemoActivity.java
[java]
package com.tianjf;
import android.app.Activity;
import android.os.Bundle;
public class JSONParseDemoActivity extends Activity {
private static final String JSONString = "{\"name\":\"Michael\",\"age\":20}";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
JSONUtils jsonUtils = new JSONUtils();
jsonUtils.parseUserFromJson(JSONString);
}
}
上面的例子隻有一個JSONObject對象,如果有多個對象怎麼做到直接映射到一個User的List裡面呢?代碼如下
User.java
同上
JSONUtils.java
[java]
package com.tianjf;
import java.lang.reflect.Type;
import java.util.Iterator;
import java.util.LinkedList;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class JSONUtils {
public void parseUserFromJson(String jsonData) {
Type listType = new TypeToken<LinkedList<User>>() {}.getType();
Gson gson = new Gson();
LinkedList<User> users = gson.fromJson(jsonData, listType);
Iterator<User> iterator = users.iterator();
while (iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println("name—>" + user.getName());
System.out.println("age—->" + user.getAge());
}
}
}
JSONParseDemoActivity.java
[java]
package com.tianjf;
import android.app.Activity;
import android.os.Bundle;
public class JSONParseDemoActivity extends Activity {
private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
JSONUtils jsonUtils = new JSONUtils();
jsonUtils.parseUserFromJson(JSONString);
}
}
摘自 殤雲的專欄