在客户端与服务器通信中,服务器下发的数据一般为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这句代码就把数据解析出来了,是不是很方便呢。
这里要注意下:
-
因为model中的属性名要与JSON数据中key一一对应,那么打正式包的时候是不能混淆model类中属性名的,要在混淆文件中添加忽略。
-
过于复杂的JSON数据要写对应的model类是不是太费劲了呢?在AndroidStudio中有这样一个插件GsonFormat:
-
安装上这个插入就可以方便的生成对应model数据类:
-
在要生成的model数据类中按 Alt键+S键,会弹出GsonFormat弹窗
-
将JSON数据拷入,点击确定
-
勾选要生成的属性,默认全部勾选,点击确定完成。
到这里解析JSON数据就讲完了,有兴趣的同学可以在网上找些复杂的JSON数据来练习下解析JSON数据。