1. 程式人生 > >Android使用GSON解析JSON資料——以解析本省市區三級資料為例

Android使用GSON解析JSON資料——以解析本省市區三級資料為例

一、認識一下JSON

JSON的語法規則:

  • 資料在名稱/值對中
  • 資料由逗號分隔
  • 物件在大括號中{}
  • 陣列在中括號內[]

由此可以看出,JSON主要是由資料、物件和陣列組成的文字。他們之間的關係大概就是

  1. 物件由多個數據(名稱/值對)組成
  2. 物件可以包含陣列
  3. 陣列可以包含多個物件

我們來看一個簡單的例子

[
 {
   "name":"一本書",
   "pages":30,
   "author":[
            "BF",
            "魚魚"
  ]
 },
 {
   "name":"兩本書",
   "pages":60,
   "author":[
            "ELF",
            "FISH"
  ]
 } 
]

               

根據大括號{}裡面的是物件,中括號[]裡面的是陣列,就很好理解了 。

瞭解到這個之後,我們就可以用GSON來解析了。

二、如何使用GSON來解析JSON文字

1.首先,我們要得到一個JSON格式的字串。在得到一個JSON格式的字串前,我們先把本地的JSON文字放進專案的assets資料夾中。

2.然後我們利用AssetManager來開啟JSON檔案然後讀取

//這是一個方法,其中filename是放在assets中的本地JSON檔名
public static String getJson(String fileName, Context context){
        //這個用來儲存JSON格式字串
        StringBuilder stringBuilder = new StringBuilder();
        AssetManager assetManager = context.getAssets();
        try{
            BufferedReader bf=new BufferedReader(new InputStreamReader(assetManager.open(fileName)));
            String line;
            while ((line=bf.readLine())!=null){
                stringBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    return stringBuilder.toString();

    }

3.接下來我們觀察一下JSON格式(連線我放文末,有需要自取)

[
  {
    "name": "北京市",
    "city": [
      {
        "name": "北京市",
        "area": [
          "東城區",
          "西城區",
          "崇文區",
          "宣武區",
          "朝陽區",
          "豐臺區",
          "石景山區",
          "海淀區",
          "門頭溝區",
          "房山區",
          "通州區",
          "順義區",
          "昌平區",
          "大興區",
          "平谷區",
          "懷柔區",
          "密雲縣",
          "延慶縣"
        ]
      }
    ]
  },
  {
    "name": "天津市",
    "city": [
      {
        "name": "天津市",
        "area": [
          "和平區",
          "河東區",
          "河西區",
          "南開區",
          "河北區",
          "紅橋區",
          "塘沽區",
          "漢沽區",
          "大港區",
          "東麗區",
          "西青區",
          "津南區",
          "北辰區",
          "武清區",
          "寶坻區",
          "寧河縣",
          "靜海縣",
          "薊  縣"
        ]
      }
    ]
  },
  {
    "name": "河北省",
    "city": [
      {
        "name": "石家莊市",
        "area": [
          "長安區",
          "橋東區",
          "橋西區",
          "新華區",
          "郊  區",
          "井陘礦區",
          "井陘縣",
          "正定縣",
          "欒城縣",
          "行唐縣",
          "靈壽縣",
          "高邑縣",
          "深澤縣",
          "贊皇縣",
          "無極縣",
          "平山縣",
          "元氏縣",
          "趙  縣",
          "辛集市",
          "藁",
          "晉州市",
          "新樂市",
          "鹿泉市"
        ]
      },
      {
        "name": "唐山市",
        "area": [
          "路南區",
          "路北區",
          "古冶區",
          "開平區",
          "新  區",
          "豐潤縣",
          "灤  縣",
          "灤南縣",
          "樂亭縣",
          "遷西縣",
          "玉田縣",
          "唐海縣",
          "遵化市",
          "豐南市",
          "遷安市"
        ]
      },
      {
        "name": "秦皇島市",
        "area": [
          "海港區",
          "山海關區",
          "北戴河區",
          "青龍滿族自治縣",
          "昌黎縣",
          "撫寧縣",
          "盧龍縣"
        ]
      },

大概看了一下發現。所有省都是一個物件,全部在一個數組裡面。然後省物件中有name和city,其中city是一個數組。city中有市級物件,有name和area,其中area是String陣列。

然後GSON解析,其實可以簡單的理解為,看到物件(大括號)就寫新類,物件中有陣列(中括號)就用List。

其中,類中的屬性名必須和JSON中的key欄位相同,或者使用註解@SerializedName("key").

3.準備類

拿上面那個為例子,整體是一個List,其中省是一個物件,裡面的資料是name和city陣列,而city中是name和area陣列

於是Province類和City類可以這樣寫

public class Province {
    @SerializedName("name")
    private String name;
    @SerializedName("city")
    private City[] city;
}

class City{
    @SerializedName("name")
    private String name;
    @SerializedName("area")
    private List<String> area;
}
4.使用GSON解析
 String result = getJson("prov-county.json",this);
 Type listType = new TypeToken<List<Province>>(){
   }.getType();
 List<Province> provinceList = new Gson().fromJson(result,listType);

就這樣,就能成功解析這個JSON文字,並將內容存到List<Province>中了。

然後就可以根據自己的需要來使用了。