安卓开发,与后台服务器对接中,JSON解析入门学习

首先这里,我们使用的工具是谷歌封装的Gson,在写这篇博文是用到的是gson 2.7,调用时需要在build.gradle 中添加下面的依赖项

compile 'com.google.code.gson:gson:2.7'

下面通过这个json串来讲解一下一些概念

{
    "status": [],
    "message": "logout successfully",
    "data": [
        {
            "pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
            "fensi": 0,
            "guanzhu": 0
        },
        {
            "pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
            "fensi": 0,
            "guanzhu": 0
        }
    ]
}

基础知识:因为在学习使用的过程,需要知道这三个基础概念:

(1)JsonElement,每一个节点就是一个JsonElement,例如,”status”: 1
(2)JsonArray ,被[…]包住的整一个部分,这种类型的JsonElement
(3)JsonObject,被{ … }包住的整一个部分,这种类型的JsonElement

我们现在要分解它们里面的元素,我们需要记住

JsonArray中可以有多个或无JsonObject,JsonObject中可以有多个或无JsonElement;
每一个JsonElement可以是JsonObject,也可以是JsonArray;

通过下面这串Json为例子,我要取”pic_dir” ,“fensi”,“guanzhu”里面的数据,可以联想为一个JsonObejct里,某个是JsonArray的JsonElement里的某个是JsonObject的JsonElement的某一个JsonElement;(相对于取“fensi”这个JsonElement,联想为取一个JsonObejct里,”data“这个是JsonArray的JsonElement里的某个是JsonObject的JsonElement的“fensi”这个JsonElement的数据;)

总结: 三个基本要素你中有我,我中有你

下面开始讲一些常见的,开发中可能会遇见的Json格式·

1.常见的第一种Json格式

{
    "status": 1,
    "message": "logout successfully",
    "data": []
}

相关代码(保持和返回Json字串的name对应一致)

public class LoginResult {
    private String status;
    private String message;
    private String data;

    public LoginResult(String status, String message, String data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

解析方法,通过ViewModel类的get/set方法来获取对应某个JsonElement的数据

//使用工具将其封装成一个类的对象
Gson gson = new Gson();
//fromJson这个方法可以将json字符串转换成ViewModel,前提是ViewModel的Filed要和
//json字符串的一致
LoginResult result = gson.fromJson(sb.toString(), LoginResult.class);

例如,获取json中message节点

Logger.d(result.getMessage());

2.常见的第二种Json格式

{
    "status": 1,
    "message": "query success",
    "data": {
        "pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
        "fensi": 0,
        "guanzhu": 0
    }
}

notes: 这种情况下,data节点下的数据对应的是 JsonObject,知道这一点后面的解析方法就清晰了,而整一个Json串又是一个JsonObject。

相关代码

public class ViewModelResult {
    private String status;
    private String message;
    private JsonObject data;

    public ViewModelResult(String status, String message, JsonObject data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public JsonObject getData() {
        return data;
    }

    public void setData(JsonObject data) {
        this.data = data;
    }
}

解析相关代码

Logger.d(receiverJsonString);
ViewModelResult result = gson.fromJson(receiverJsonString,ViewModelResult.class);
JsonObject dataStr = result.getData();
Logger.d(dataStr.toString());
...
JsonObject receiveJson;
FansViewModel viewModel;
//将整一个json字符串转换成json对象
receiveJson = dataStr;
viewModel = new FansViewModel();
viewModel.setPic_dir(receiveJson.get("pic_dir").getAsString());
viewModel.setFensi(receiveJson.get("fensi").getAsInt());
viewModel.setGuanzhu(receiveJson.get("guanzhu").getAsInt());
viewModels.add(viewModel);

3.第三种Json格式

{
    "status": 1,
    "message": "logout successfully",
    "data": [
        {
            "pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
            "fensi": 0,
            "guanzhu": 0
        },
        {
            "pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
            "fensi": 0,
            "guanzhu": 0
        }
    ]
}

解析相关代码,获取”pic_dir”,原理就是通过利用fromJson方法解析后获得的ViewModel的第三个JsonElement是一个JsonArray,先通过JsonArray的方法获取到JsonObject然后再获取你想要的JsonElement。方法就不赘述了。

//关键方法
jsonArray.get(i).getAsJsonObject();
jsonObject.get(i).getAsString();
//先将下面这个服务器返回的字符串转换成Json数组
            String receiverJsonString = readStream(is);
            Logger.d(receiverJsonString);
            HomeInitialResult result = gson.fromJson(receiverJsonString,HomeInitialResult.class);
            JsonArray receiveJson = result.getData();

            int size = receiveJson.size();
            Logger.d(receiveJson.toString()+"\nJsonArraySize --- " + size);
            //JsonObject 进一步拆分
            HomeInitialItem viewModel = null;
            for(int i=0; i<size; i++) {
                //将整一个json字符串转换成json对象
                viewModel = new HomeInitialItem();
                viewModel.setPic_dir(receiveJson.get(i).getAsJsonObject().get("pic_dir").getAsString());
                viewModel.setAct_id(receiveJson.get(i).getAsJsonObject().get("act_id").getAsInt());
                viewModel.setAct_title(receiveJson.get(i).getAsJsonObject().get("act_title").getAsString());
                dataLists.add(viewModel);
            }

这是我的一些见解,大神勿喷,如有错误会及时勘正。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值