博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSON数据造假和解析
阅读量:6192 次
发布时间:2019-06-21

本文共 2676 字,大约阅读时间需要 8 分钟。

客户端开发通常要从服务器获取数据,所以就需要调用后台的接口,然后获得后台返回的数据,根据这些数据的格式进行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
>() {});
代码中的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
list;
同样的,我们可以用下面这条语句取到我们想要的值:

list = JSON.parseObject(data, new TypeReference
>() {});

那么如何拿到这些数据呢?数组的话我们可以用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
>() {});

转载地址:http://pcgda.baihongyu.com/

你可能感兴趣的文章
spoj3105 MOD - Power Modulo Inverted(exbsgs)
查看>>
Apache Camel 与 Spring Boot 集成,通过FTP定时采集、处理文件
查看>>
linux libjpeg 安装
查看>>
脚印:一次重构讨论
查看>>
Python学习的第二周作业--购物车
查看>>
D.6661 - Equal Sum Sets
查看>>
确保每一步的业务代码都能够正确执行。
查看>>
etcd:从应用场景到实现原理的全方位解读
查看>>
python基础===map和zip的用法
查看>>
【UVA 11426】gcd之和 (改编)
查看>>
iOS调用系统相册、相机 显示中文标题
查看>>
SEU第一次训练练习题
查看>>
重新定义日志成员
查看>>
Ansible安装
查看>>
poj3270
查看>>
python的requests模块参数详解
查看>>
-sh: ./helloworld: not found
查看>>
eclipse - The superclass "javax.servlet.http.HttpServlet" was not found on the Java
查看>>
数学 FZU 2074 Number of methods
查看>>
.NET MVC与三层架构
查看>>