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>中了。

然后就可以根据自己的需要来使用了。

省市区JSON以及Demo:https://download.csdn.net/download/bfelfish/10616954

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值