JSON数据造假和解析

客户端开发通常要从服务器获取数据,所以就需要调用后台的接口,然后获得后台返回的数据,根据这些数据的格式进行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>>() {
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值