您的位置:首页 > 移动开发 > Android开发

Android基础之使用Gson解析json数据 第一弹

2016-10-27 00:02 549 查看

Android基础之使用Gson解析json数据 第一弹

首先介绍一下JSON数据的格式

JSON数据JSON对象可解析成
{……..}JSONObjectMap或Object
[……..]JSONArrayList
* 总结:当我们看到 {……..},可以认为他就是一个Map或者是一个自定义的Object,当我们看到 [……..],可以认为他就是一个List

数据解析后的数据类型
“code”: 0数据:0 没有双引号,表示Number(int/double/float)型,后面统称为Number型
“message”: “0”数据:”0”,有双引号,表示String型
“data”: false数据:false,表示boolean型
“data”: {……}数据:{……},表示Map型
“data”: [……]数据:[……] ,表示List型
“data”: null数据:null,表示空,数据类型未知,可以认为是Object
* 总结:json有以上6种数据类型,归类可以分为两种

* 1、基础数据类型 Number型和boolean型

* 2、对象类型:包括String,List,Map,及其它Object

分类讲解

无论遇到什么样的json数据,我们都是从最外层一步一步往里面分析。

1.单个JSONObject数据

{
"code": 0,
"message": "成功"
}


分析:

最外层是一个{…..},根据上面的表格,这个格式可以解析成 Map或者Object

如果解析成Map,会生成两组键值对 key = “code” value = 0 和 key = “message” value = “成功”

如果解析成Object, code和message将是两个成员变量名,类型分别为int 和 String

//解析称Map的例子
Gson gson = new Gson();
Map map = gson.fromJson(json, Map.class);
int code = (int) map.get("code");


//解析成Object实体类类
public class Entity {
private int code;
private String message;
}

Gson gson = new Gson();
Entity entity = gson.fromJson(json, Entity.class);


2.单个JSONArray数据


[{ "code": 0, "message": "成功" },{ "code": 0, "message": "成功" }
]


分析:

最外层是一个【…】,说面可以解析称List。

【…】里面是两个{….},说明List里面是两个Object或Map

因此可以解析成List或List《Object》

//解析成List<Entity>
Type listType = new TypeToken<List<Entity>>(){}.getType();
Gson gson = new Gson();
List<Entity> list = gson.fromJson(json, listType);

//也可以解析成List<Map>
Type listType = new TypeToken<List>(){}.getType();
Gson gson = new Gson();
List<Map> list = gson.fromJson(json, listType);


3.JSONObject内含有JSONArray


{
"code": 0,
"message": "成功",
"data":
[{ "code": 0, "message": "成功" },{ "code": 0, "message": "成功" }
]
}


分析:

最外层是一个 {….},说面可以解析称 Map或者Object

最外层的{….}里面有3个key,分别是 code(int型),message(String型),data(Object型),如下:

public class Entity {
private int code;
private String message;
private Object data;
}


那么data到底是什么类型呢?我们接着往下看。

data里面的数据是一个【…】,说明是一个List

而List里面是两个{…},也是就是两个Map或者Object,我们可以将这个对象封装成Bean

因此 data类型为List《Bean》

public class Entity {
private int code;
private String message;
private List<Bean> data;

public static class Bean {
private int code;
private String message;
}
}


4.单个JSONObject,里面包含了单个JSONObject数据,而这个JSONObject又包含了一个JSONArray


{
"code": 0,
"message": "成功",
"data": {
"data1": [{ "code": 0, "message": "成功" },{ "code": 0, "message": "成功" },
],
"data2": [{ "code": 0, "message": "成功" },{ "code": 0, "message": "成功" },
]
}
}


分析

1. 最外层是{…},说明整体可以解析成一个对象Object或者Map,我们通常会封装成Object

2. 这个Object包含三个成员变量,code(int型),message(String型),data(Object)

public class Entity {
private int code;
private String message;
private Object data;
}


这个Object data到底是什么数据类型呢?我们接着往下看。

data后面是一个{…},说明是一个Map或者是Object。通常我们都是封装称Object,那我们就先封装试试

这个data Object 包含两个成员变量,分别是data1和data2。

data1和data2后面是【…】说明data1和data2是两个List,如下:

public class Entity {
private int code;
private String message;
private Data data;

public static class Data {
private List<Bean> data1;
private List<Bean> data2;
}

public static class Bean {
private int code;
private String message;
}
}


如果看到这里还有点懵逼的朋友,建议看看上面的解析过程!!!

现在就出现一个问题,这个data1和data2是不确定的,有时候是data3甚至是data100。怎么办?

我们回归至前面分析的第4条,再次分析一次,寻找突破口:

data后面是一个{…},说明是一个Map或者是Object。通常我们都是封装称Object,那我们就先封装试试

实践证明,封装成Object是不合理的,因为作为成员变量的data1和data2是不固定的。

既然不能封装成Object,那就是使用Map,这个Map包含两个key 分别是data1和data2,这两个key对应的值是两个List

因此data的数据类型是 Map《String,List《Bean》》,如下:

public class Entity {
private int code;
private String message;
private Map<String, List<Bean>> data;

public static class Bean {
private int code;
private String message;
}
}


后续有空将推出Gson异常处理,和重构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android json gson 对象 数据