Android_JSON解析

JSON是JavaScript Object Notation的縮寫,可見JSON來源於JavaScript。JSON數據是一系列鍵值對的集合。

JSON和XML的比較

  • JSON比XML體積小
  • JSON和JavaScript交互更加方便
  • JSON對數據的描述性沒有XML好
  • JSON的速度要遠遠大於XML
  • JSON的解析要比XML的解析要方便

JSON已經被大多數開發人員所接受,在網絡數據的傳輸當中應用非常廣泛


下面的代碼就是一個JSON:

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. {    
  2. "phone" : ["12345678", "87654321"], // 數組    
  3. "name" : "tianjiefeng", // 字符串    
  4. "age" : 100, // 數值    
  5. "address" : { "country" : "china", "province" : "jiangsu" }, // JSON對象    
  6. "married" : false // 布爾值    
  7. }  
JSON是以key/value的形式存在的,key是Strng類型的,value的類型可以是一個數組,可以是一個字符串,可以是一個數值,也可以是一個布爾值,甚至可以是一個JSON對象


一、JSONObject的創建

我們先來看一個Demo,把上面的JSON對象創建出來,並且寫入存儲卡文件

既然要寫入存儲卡,那麼就必須在AndroidManifest.xml中加入一下權限

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

接着在JSONCreateDemoActivity.java裏面編寫如下代碼:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tianjf;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.PrintStream;  
  7.   
  8. import org.json.JSONArray;  
  9. import org.json.JSONException;  
  10. import org.json.JSONObject;  
  11.   
  12. import android.app.Activity;  
  13. import android.os.Bundle;  
  14. import android.os.Environment;  
  15.   
  16. public class JSONCreateDemoActivity extends Activity {  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.   
  22.         // 判斷sdcard存不存在,不存在不操作  
  23.         if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  
  24.             // 返回到程序的被調用出  
  25.             return;  
  26.         }  
  27.   
  28.         // 將JSON對象寫入存儲卡  
  29.         writeJSONObjectToSdCard(createJSONObject());  
  30.     }  
  31.   
  32.     // 創建以下的JSON對象  
  33.     // {  
  34.     // "phone" : ["12345678", "87654321"], // 數組  
  35.     // "name" : "tianjiefeng", // 字符串  
  36.     // "age" : 100, // 數值  
  37.     // "address" : { "country" : "china", "province" : "jiangsu" }, // JSON對象  
  38.     // "married" : false // 布爾值  
  39.     // }  
  40.     private JSONObject createJSONObject() {  
  41.         // 最外層是{},也就是一個JSONObject對象  
  42.         JSONObject person = new JSONObject();  
  43.         try {  
  44.             // 第1個value是[ ],也就是一個JSONArray對象  
  45.             JSONArray phone = new JSONArray();  
  46.             phone.put("12345678");  
  47.             phone.put("87654321");  
  48.             person.put("phone", phone);  
  49.             // 第2個value一個字符串  
  50.             person.put("name""tianjiefeng");  
  51.             // 第3個value一個字符串數值  
  52.             person.put("age"100);  
  53.             // 第4個value一個JSONObject對象  
  54.             JSONObject address = new JSONObject();  
  55.             address.put("country""china");  
  56.             address.put("province""jiangsu");  
  57.             person.put("address", address);  
  58.             // 第5個value一個布爾值  
  59.             person.put("married"false);  
  60.         } catch (JSONException e) {  
  61.             e.printStackTrace();  
  62.         }  
  63.         return person;  
  64.     }  
  65.   
  66.     /** 
  67.      * 將JSON對象寫入存儲卡 
  68.      *  
  69.      * @param person 
  70.      * @throws FileNotFoundException 
  71.      */  
  72.     private void writeJSONObjectToSdCard(JSONObject person) {  
  73.         File file = new File(Environment.getExternalStorageDirectory() + File.separator + "json"  
  74.                 + File.separator + "json.txt");  
  75.         // 文件夾不存在的話,就創建文件夾  
  76.         if (!file.getParentFile().exists()) {  
  77.             file.getParentFile().mkdirs();  
  78.         }  
  79.         // 寫入內存卡  
  80.         PrintStream outputStream = null;  
  81.         try {  
  82.             outputStream = new PrintStream(new FileOutputStream(file));  
  83.             outputStream.print(person.toString());  
  84.         } catch (FileNotFoundException e) {  
  85.             e.printStackTrace();  
  86.         } finally {  
  87.             if (outputStream != null) {  
  88.                 outputStream.close();  
  89.             }  
  90.         }  
  91.     }  
  92. }  

運行一下,打開File Explorer視圖,打開mnt - sdcard - json目錄,將裏面的json.txt導出到計算機裏面,就可以看到JSON對象以字符串的形式成功寫入到了json.txt文件中


二、JSONObject的解析

直接將字符串轉化爲JSONObject對象來解析的Demo

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tianjf;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import org.json.JSONException;  
  7. import org.json.JSONObject;  
  8.   
  9. import android.app.Activity;  
  10. import android.os.Bundle;  
  11. import android.util.Log;  
  12.   
  13. public class JSONParseDemoActivity extends Activity {  
  14.   
  15.     private static final String JSONString = "{" + "\"phone\":[\"12345678\",\"87654321\"],"  
  16.             + "\"name\":\"tianjiefeng\"," + "\"age\":100,"  
  17.             + "\"address\":{\"country\":\"china\",\"province\":\"jiangsu\"},"  
  18.             + "\"married\":false" + "}";  
  19.   
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.main);  
  24.   
  25.         // 解析得到一個Map對象  
  26.         Map<String, Object> personMap = parseJSONString(JSONString);  
  27.         Log.d("debug",  
  28.                 "phone:" + personMap.get("phone") + "\n" + "name:" + personMap.get("name") + "\n"  
  29.                         + "age:" + personMap.get("age") + "\n" + "address:"  
  30.                         + personMap.get("address") + "\n" + "married:" + personMap.get("married"));  
  31.     }  
  32.   
  33.     /** 
  34.      * JSON解析 
  35.      *  
  36.      * @param JSONString 
  37.      * @return 
  38.      */  
  39.     private Map<String, Object> parseJSONString(String JSONString) {  
  40.         Map<String, Object> resultMap = new HashMap<String, Object>();  
  41.         try {  
  42.             // 直接把JSON字符串轉化爲一個JSONObject對象  
  43.             JSONObject person = new JSONObject(JSONString);  
  44.             // 第1個鍵值對  
  45.             resultMap.put("phone", person.getJSONArray("phone").toString());  
  46.             // 第2個鍵值對  
  47.             resultMap.put("name", person.getString("name"));  
  48.             // 第3個鍵值對  
  49.             resultMap.put("age", person.getInt("age"));  
  50.             // 第4個鍵值對  
  51.             resultMap.put("address", person.getJSONObject("address").toString());  
  52.             // 第5個鍵值對  
  53.             resultMap.put("married", person.getBoolean("married"));  
  54.         } catch (JSONException e) {  
  55.             e.printStackTrace();  
  56.         }  
  57.         return resultMap;  
  58.     }  
  59. }  

運行之後打印出來的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包導入項目的流程如下:

  1. 新建libs文件夾,把下載的jar包添加到libs文件夾中
  2. 右鍵gson-1.6.jar --> Build Path --> Add to Build Path(add操作之後就會看到Package視圖下的Referenced Libraries下多了個gson-1.6.jar,說明jar包添加成功) 

添加好了jar包,我們就可以使用JsonReader了。具體代碼如下

JSONUtils.java

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tianjf;  
  2.   
  3. import java.io.StringReader;  
  4.   
  5. import com.google.gson.stream.JsonReader;  
  6.   
  7. public class JSONUtils {  
  8.     public void parseJson(String jsonData) {  
  9.         try {  
  10.             // 如果需要解析JSON數據,首要要生成一個JsonReader對象  
  11.             JsonReader reader = new JsonReader(new StringReader(jsonData));  
  12.             // 開始解析數組  
  13.             reader.beginArray();  
  14.             // 判斷數組裏面還有沒下一個JSONObject對象  
  15.             while (reader.hasNext()) {  
  16.                 // 開始解析對象  
  17.                 reader.beginObject();  
  18.                 // 判斷當前JSONObject對象裏面還有沒下一個鍵值對  
  19.                 while (reader.hasNext()) {  
  20.                     // 取出當前鍵值對的key  
  21.                     String tagName = reader.nextName();  
  22.                     // 取出key所對應的value  
  23.                     if (tagName.equals("name")) {  
  24.                         System.out.println("name--->" + reader.nextString());  
  25.                     } else if (tagName.equals("age")) {  
  26.                         System.out.println("age--->" + reader.nextInt());  
  27.                     }  
  28.                 }  
  29.                 // 結束解析對象  
  30.                 reader.endObject();  
  31.             }  
  32.             // 結束解析數組  
  33.             reader.endArray();  
  34.         } catch (Exception e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.     }  
  38. }  

JSONParseDemoActivity.java

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tianjf;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class JSONParseDemoActivity extends Activity {  
  7.   
  8.     private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";  
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.   
  15.         JSONUtils jsonUtils = new JSONUtils();  
  16.         jsonUtils.parseJson(JSONString);  
  17.     }  
  18. }  

這個例子是解析[{"name":"Michael","age":20},{"name":"Mike","age":21}]這個JSON字符串

先分析一下這個JSON字符串的結構:一個JSONArray裏面有兩個JSONObject

再分析一下JsonReader解析這個JSON字符串的流程:

  1. 遇到【[】,開始解析數組(reader.beginArray())
  2. 遇到【{】,開始解析對象(reader.beginObject())
  3. 遇到【"】,開始解析第一個鍵值對
  4. 遇到【"】,開始解析第二個鍵值對
  5. 遇到【}】,結束解析對象(reader.endObject())
  6. 遇到【{】,開始解析對象(reader.beginObject())
  7. 遇到【"】,開始解析第一個鍵值對
  8. 遇到【"】,開始解析第二個鍵值對
  9. 遇到【}】,結束解析對象(reader.endObject())
  10. 遇到【]】,結束解析數組(reader.endArray())


Gson類的fromJson方法自動解析並自動得到一個Entity對象,代碼如下

User.java

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tianjf;  
  2.   
  3. public class User {  
  4.     private String name ;  
  5.     private int age ;  
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.     public int getAge() {  
  13.         return age;  
  14.     }  
  15.     public void setAge(int age) {  
  16.         this.age = age;  
  17.     }  
  18. }  

JSONUtils.java

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tianjf;  
  2.   
  3. import com.google.gson.Gson;  
  4.   
  5. public class JSONUtils {  
  6.     public void parseUserFromJson(String jsonData) {  
  7.         Gson gson = new Gson();  
  8.         // Gson的fromJson方法是一 一對應的關係,自動將JSON的數據匹配到User對象中  
  9.         User user = gson.fromJson(jsonData, User.class);  
  10.         System.out.println("name--->" + user.getName());  
  11.         System.out.println("age---->" + user.getAge());  
  12.     }  
  13. }  

JSONParseDemoActivity.java

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tianjf;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class JSONParseDemoActivity extends Activity {  
  7.   
  8.     private static final String JSONString = "{\"name\":\"Michael\",\"age\":20}";  
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.   
  15.         JSONUtils jsonUtils = new JSONUtils();  
  16.         jsonUtils.parseUserFromJson(JSONString);  
  17.     }  
  18. }  

上面的例子只有一個JSONObject對象,如果有多個對象怎麼做到直接映射到一個User的List裏面呢?代碼如下

User.java

同上


JSONUtils.java

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tianjf;  
  2.   
  3. import java.lang.reflect.Type;  
  4. import java.util.Iterator;  
  5. import java.util.LinkedList;  
  6.   
  7. import com.google.gson.Gson;  
  8. import com.google.gson.reflect.TypeToken;  
  9.   
  10. public class JSONUtils {  
  11.     public void parseUserFromJson(String jsonData) {  
  12.         Type listType = new TypeToken<LinkedList<User>>() {}.getType();  
  13.         Gson gson = new Gson();  
  14.         LinkedList<User> users = gson.fromJson(jsonData, listType);  
  15.         Iterator<User> iterator = users.iterator();  
  16.         while (iterator.hasNext()) {  
  17.             User user = (User) iterator.next();  
  18.             System.out.println("name--->" + user.getName());  
  19.             System.out.println("age---->" + user.getAge());  
  20.         }  
  21.     }  
  22. }  

JSONParseDemoActivity.java

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tianjf;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class JSONParseDemoActivity extends Activity {  
  7.   
  8.     private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";  
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.   
  15.         JSONUtils jsonUtils = new JSONUtils();  
  16.         jsonUtils.parseUserFromJson(JSONString);  
  17.     }  
  18. }  
發佈了8 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章