Android使用GSON解析JSON資料——以解析本省市區三級資料為例
阿新 • • 發佈:2019-01-04
一、認識一下JSON
JSON的語法規則:
- 資料在名稱/值對中
- 資料由逗號分隔
- 物件在大括號中{}
- 陣列在中括號內[]
由此可以看出,JSON主要是由資料、物件和陣列組成的文字。他們之間的關係大概就是
- 物件由多個數據(名稱/值對)組成
- 物件可以包含陣列
- 陣列可以包含多個物件
我們來看一個簡單的例子
[ { "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>中了。
然後就可以根據自己的需要來使用了。