客户端开发通常要从服务器获取数据,所以就需要调用后台的接口,然后获得后台返回的数据,根据这些数据的格式进行JSON解析。
由于后台返回的数据会有不同的格式,所以前端也要采取不同的JSON.parse()方法进行解析。
首先,来讲一下JSON数据。
简单的JSON数据就像下面这种,我们称之为名称/键对:
{ "name":"Sherry" , "password":"123456" }
我们在客户端解析的时候可以新建一个如下的一个对象类:
public class UserModel {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
然后把获取到的数据data进行数据解析,方法如下(其中user是UserModel的一个对象):
user = JSON.parseObject(data, UserModel.class);
解析出来后我们就可以在相应的Activity或Fragement界面对这个user进行使用,通过user.get()方法把从后台获取到的name和password值赋值给我们想要显示的地方。就比如我们写了一个TextView用来显示name,只需要
TextView tvName = (TextView)findViewById(R.id.***);
tvName.setText(model.getName());
除了上面这种简单的传递对象的JSON格式,我们也经常会遇到传递数组的情况,这种情况比传递名称/键对相对来说复杂一点,类似于下面这样:
{
"userList": [
{ "name":"Sherry" , "password":"123456" },
{ "name":"Anna" , "password":"654321" }
]
}
这其实就是一个List<UserModel>的数组,所以我们像下面这种方式对这个数组进行JSON解析(其中list是Lis<UserModel>的一个对象):
list = JSON.parseObject(data, new TypeReference<List<UserModel>>() {
});
代码中的TypeReference可以用来应对复杂的泛型,通过解析我们可以把这个list以及其中的数据放到我们想要设置的地方。这些都是相对比较简单的数据,所以来说一下数组和名称/键值结合一块用的,示例的返回数据如下:
{
"hobby": [
{
"name": "Sherry",
"password": "123456",
"hobby": {
"id": "1",
"hobbyName": "basketball"
}
}
]
}
对于这样的一串数据,首先我们要看最外层的是数组类型还是名称/键值对象,由于上面的数据最外层是由"[ ]"括起来的,所以user_hobby很明显是一个数组,然后在这个数组里面有三个字段:name、password、hobby,在hobby里面最外层又是由"{ }"组成的,因此hobby是一个名称/键对。我们可以有里及外的剖析:
首先可以新建一个HobbyModel对象类,其中添加id和hobbyName这两个字段和他们的set/get方法,这个就不说了,和上面的UserModel类似,然后我们可以再新建一个AboutMeModel对象类,不同的是我们的字段有了一些变化,主要代码如下:
private String name;
private String password;
private List<HobbyModel> list;
同样的,我们可以用下面这条语句取到我们想要的值:
list = JSON.parseObject(data, new TypeReference<List<AboutMeModel>>() {
});
那么如何拿到这些数据呢?数组的话我们可以用for循环,比如我们要取到“Sherry”这条数据,就可以用for循环,也就是list.get(0).getName(),而如果要取到hobbyName,也就是list.get(0).getHobby().get(0).getHobbyName()。
不过由于我们是要调后台接口的,所以有时候后台传送的数据不符合我们的要求,为了避免这个问题,我们可以自己制造JSON假数据。首先我们假设我们希望后台传给我们的数据是上面那一条,我们可以把从后台获取的data重新赋值,代码如下:
String data = "{\"hobby\": "
+ "[{\"name\": \"Sherry\","
+ "\"password\": \"123456\","
+ "\"hobby\":" +
"{\"id\": \"1\","
+ "\"hobbyName\": \"basketball\""
+ "}}]}";
在上面的代码中有很多“\",这是因为我们的数据中有一些数据是String类型的,需要有""包裹,而单独使用“”会引起报错,所以需要“\"进行转义,\”也就是我们String语句中的“。
以上就是我关于JSON解析的一些小见解,有不对的地方欢迎指正。
list = JSON.parseObject(data, new TypeReference<List<UserModel>>() {
});