Android解析JSON数据

在客户端与服务器通信中,服务器下发的数据一般为JSON或XML格式(Json居多),客户端要解析对应的数据,显示到UI或保存数据。

如果不了解JSON数据请查看百度JSON

本文主要讲解如何解析JSON,关于请求服务器下发数据等请读者自行查阅相关资料

  • 解析简单JSON
    首先我们来看一段JSON数据如下:
{
    "age": 22,
    "name": "wuxiaoqi",
    "sex": "男"
}

很简单的一段JSON数据,age对应年龄,name对应姓名,sex对应性别。
JSON数据中以key:value键值对形式保存数据,如age,name,sex都是key,冒号后对应value值,在JSON中**{}**对应JSONObject。

下面给出代码来解析上述JSON数据

String json = "{\n" +
                "    \"age\": 22,\n" +
                "    \"name\": \"wuxiaoqi\",\n" +
                "    \"sex\": \"男\"\n" +
                "}";

try {
     JSONObject jsonObject = new JSONObject(json);
     int age = jsonObject.getInt("age");
     String name = jsonObject.getString("name");
     String sex = jsonObject.getString("sex");
     Log.i(TAG, "age:" + age + ",name:" + name + ",sex:" + sex);
     } catch (JSONException e) {
        e.printStackTrace();
     }

运行程序,可以看到数据已经成功解析出来了,是不是很简单了
这里写图片描述

这里要注意下key:value中value带双引号为字符串类型,不带字符串为整型
如上述 **int age = jsonObject.getInt(“age”);**age为整型,所以要用getInt()方法解析,下图给出JSONObject中对应解析的方法:
这里写图片描述

  • 解析复杂JSON
    下面给出一段稍微复杂的JSON数据
{
    "student": [
        {
            "age": 22,
            "name": "wuxiaoqi",
            "sex": "男"
        },
        {
            "age": 18,
            "name": "卡特A",
            "sex": "女"
        }
    ]
}

上述JSON数据中多出了**[][]**对应JSONArray,只要记住2点

  1.  {}  使用JSONObject解析
  2.  []  使用JSONArray解析

解析代码如下:

String json = "{\n" +
                "    \"student\": [\n" +
                "        {\n" +
                "            \"age\": 22,\n" +
                "            \"name\": \"wuxiaoqi\",\n" +
                "            \"sex\": \"男\"\n" +
                "        },\n" +
                "        {\n" +
                "            \"age\": 18,\n" +
                "            \"name\": \"卡特A\",\n" +
                "            \"sex\": \"女\"\n" +
                "        }\n" +
                "    ]\n" +
                "}";

try {
     JSONObject jsonObject = new JSONObject(json);
     JSONArray jsonArray = jsonObject.getJSONArray("student");
     JSONObject j1 = jsonArray.getJSONObject(0);
     JSONObject j2 = jsonArray.getJSONObject(1);

     print(j1);
     print(j2);
    } catch (JSONException e) {
       e.printStackTrace();
    }

private void print(JSONObject jObject) throws JSONException {
     int age = jObject.getInt("age");
     String name = jObject.getString("name");
     String sex = jObject.getString("sex");
     Log.i(TAG, "age:" + age + ",name:" + name + ",sex:" + sex);
 }

运行程序,可以看到已经成功解析出数据了
这里写图片描述

这里要注意下JSONArray是个数组,我们可以通过getJSONObject()方法获取对应下标的JSONObject,下标从0开始,这里给出JSONArray中对应的解析方法:
这里写图片描述

  • 使用GSON解析JSON
    如果JSON数据过于复杂,那么我们可以使用第三方库来方便解析JSON,这里我们使用了谷歌公司提供的库GSON
    首先在build.gradle文件添加依赖
compile 'com.google.code.gson:gson:2.2.4'

首先新建一个model类对应我们的要解析的数据:

public class StudentModel {
    public int age;
    public String name;
    public String sex;

   @Override
    public String toString() {
        return "StudentModel{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

这里要注意下,属性名要于JSON数据中的key一一对应。

使用GSON解析代码如下:

String json = "{\n" +
                "    \"age\": 22,\n" +
                "    \"name\": \"wuxiaoqi\",\n" +
                "    \"sex\": \"男\"\n" +
                "}";

Gson gson = new Gson();
StudentModel studentModel = gson.fromJson(json, StudentModel.class);
Log.i(TAG, studentModel.toString());

这里写图片描述

可以看到我们代码只使用了gson.fromJson这句代码就把数据解析出来了,是不是很方便呢。

这里要注意下:

  1. 因为model中的属性名要与JSON数据中key一一对应,那么打正式包的时候是不能混淆model类中属性名的,要在混淆文件中添加忽略

  2. 过于复杂的JSON数据要写对应的model类是不是太费劲了呢?在AndroidStudio中有这样一个插件GsonFormat:

  3. 这里写图片描述
    安装上这个插入就可以方便的生成对应model数据类:
    这里写图片描述

  4. 在要生成的model数据类中按 Alt键+S键,会弹出GsonFormat弹窗

  5. 将JSON数据拷入,点击确定

  6. 勾选要生成的属性,默认全部勾选,点击确定完成。

到这里解析JSON数据就讲完了,有兴趣的同学可以在网上找些复杂的JSON数据来练习下解析JSON数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值