JSON為新一代的資料傳輸格式,這裡有一篇文章對XML和JSON進行了清楚的比較。下面的程式透過JSONObject和JSONArray展示出如何解析放在SD卡裡面的JSON資料,檔名取為json_file。
下面為json_file的內容
{
"student num":"3",
"student":
[
{"name":"Gill",
"age":"15"},
{"name":"Tom",
"age":"14"},
{"name":"John",
"age":"17"}
]
}
讀取JSON的觀念是針對每個Key去讀取其Value的,可以想像{}裡面就是一個JSONObject。而因為JSON裡面的資料可以像陣列般包含多項內容,這時候就用getJSONArray一口氣全部抓出來。大致上的流程是
(1)建立字串:內容為JSON所有的資料
(2)利用上述字串建立JSONObject
(3)利用JSONObjec取得資料 : 像是利用getInt(),getString()....等
(4)如果要解析的資料是陣列式的 : 先利用getJSONArray取出JSONARRAY後,再配合for迴圈把每個細項也就是JSONObject建立起來出來。有了JSONObject要讀資料,就和步驟(3)一樣。
程式碼如下:
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startParser();
}
public void startParser() {
try {
String jsonString = readJsonFile();
JSONObject jsonResponse = new JSONObject(jsonString);
//直接由JSONObject取出資料
Integer studentNum = jsonResponse.getInt("student num");
Log.d("Test","The number of student is :" + studentNum);
//處理陣列型式的資料要多一個步驟
//就是先建立JSONArray,再搭配for迴圈建立JSONObject
JSONArray jsonArray = jsonResponse.getJSONArray("student");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Log.d("Test","The name value is :" + jsonObject.getString("name"));
Log.d("Test","The age value is :" + jsonObject.getString("age"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
//這裡先將檔案json_file裡的內容讀出,再轉換成字串
private String readJsonFile(){
FileInputStream fin;
String returnString = "";
try {
fin = new FileInputStream(new File("sdcard/tmp/json_file"));
byte[] buffer = new byte[fin.available()];
while (fin.read(buffer) != -1) ;
returnString = new String(buffer);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return returnString;
}
}
執行結果如下:
下面為json_file的內容
{
"student num":"3",
"student":
[
{"name":"Gill",
"age":"15"},
{"name":"Tom",
"age":"14"},
{"name":"John",
"age":"17"}
]
}
讀取JSON的觀念是針對每個Key去讀取其Value的,可以想像{}裡面就是一個JSONObject。而因為JSON裡面的資料可以像陣列般包含多項內容,這時候就用getJSONArray一口氣全部抓出來。大致上的流程是
(1)建立字串:內容為JSON所有的資料
(2)利用上述字串建立JSONObject
(3)利用JSONObjec取得資料 : 像是利用getInt(),getString()....等
(4)如果要解析的資料是陣列式的 : 先利用getJSONArray取出JSONARRAY後,再配合for迴圈把每個細項也就是JSONObject建立起來出來。有了JSONObject要讀資料,就和步驟(3)一樣。
程式碼如下:
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startParser();
}
public void startParser() {
try {
String jsonString = readJsonFile();
JSONObject jsonResponse = new JSONObject(jsonString);
//直接由JSONObject取出資料
Integer studentNum = jsonResponse.getInt("student num");
Log.d("Test","The number of student is :" + studentNum);
//處理陣列型式的資料要多一個步驟
//就是先建立JSONArray,再搭配for迴圈建立JSONObject
JSONArray jsonArray = jsonResponse.getJSONArray("student");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Log.d("Test","The name value is :" + jsonObject.getString("name"));
Log.d("Test","The age value is :" + jsonObject.getString("age"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
//這裡先將檔案json_file裡的內容讀出,再轉換成字串
private String readJsonFile(){
FileInputStream fin;
String returnString = "";
try {
fin = new FileInputStream(new File("sdcard/tmp/json_file"));
byte[] buffer = new byte[fin.available()];
while (fin.read(buffer) != -1) ;
returnString = new String(buffer);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return returnString;
}
}
執行結果如下:
沒有留言:
張貼留言