一、认识一下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>中了。
然后就可以根据自己的需要来使用了。
省市区JSON以及Demo:https://download.csdn.net/download/bfelfish/10616954