使用Gson解析json

json的两种数据格式:

json就是用来进行网络数据传输的一种格式,目前的使用很广泛,其格式就是一种键值对的形式,很方便进行解析。json有JsonObject和JsonArray两种形式,如何进行区分呢?

-凡是看到 { 就是一个JsonObject

-凡是看到 [ 就是一个JsonArray

Gson解析json方式:

Gson是谷歌开发的一个用来解析json的库,简单好用。源码可见github而且里面还有详细的说明文档。首先需要根据json的格式来定义对应的bean。

1. 解析JsonObject:

如下面的json,是一个JsonObeject类型。json使用来分割一个键值对,使用来分割不同的键值对。

{'name':'buder','age':'20'}

我们可以定义一个Person bean,其成员变量就是对应的key值:

public class Person {
    public String name;
    public Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

 下面使用Gson解析成java bean对象:

    private void transformStepOne() {
        String json = "{'name':'buder','age':'20'}";
        // 将json编译成对象
        Gson gson = new Gson();
        Person person = gson.fromJson(json, Person.class);
        Log.e("Person Object", person.getName() + " " + person.getAge());
    }

完成之后,这样我们就可以得到一个Person的类,里面的成员变量会被Gson自动写好数据。

2.JsonObject内部嵌套JsonObject:

{'name':'buder','age':'20', 'address':{'postid':'473000'}}

这时需要改变Person类的结构,在Person内部嵌套一个Address的类即可:

public class Person {
    private String name;
    private Integer age;
    private Address address = new Address();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public static class Address {
        private String postid;

        public String getPostid() {
            return postid;
        }

        public void setPostid(String postId) {
            this.postid = postId;
        }
    }

}

解析方式和第一种完全一致:

    private void transformStepTwo() {
        String json = "{'name':'buder','age':'20', 'address':{'postid':'473000'}}";

        Gson gson = new Gson();
        Person person = gson.fromJson(json, Person.class);
        Log.e("Person Object", person.getAddress().getPostid());
    }

解析结果:

3.JsonObejcet嵌套JsonArray

Json数据格式如下:

{'name':'buder','age':'20', 'address':[{'postid':'100011'}, {'postid':'666999'}]}

我们只需要在Person类里面Address的类型改为List的即可。

Person数据结构:

public class Person {
    private String name;
    private Integer age;
    private List<Address> address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public List<Address> getAddress() {
        return address;
    }

    public void setAddress(List<Address> address) {
        this.address = address;
    }

    public static class Address {
        private String postid;

        public String getPostid() {
            return postid;
        }

        public void setPostid(String postId) {
            this.postid = postId;
        }
    }

}

解析方式和之前的保持一致:

private void transformStepThree() {
        String json = "{'name':'buder','age':'20', 'address':[{'postid':'100011'}, {'postid':'666999'}]}";

        Gson gson = new Gson();
        Person person = gson.fromJson(json, Person.class);
        Log.e("Person Object", person.getAddress().get(1).getPostid());
    }

最终解析结果:

上面完整的解析可以参考GitHub,git中还添加了一个复杂的解析示例:

https://github.com/buder-cp/base_component_learn/tree/master/gsontest

 

参考文章:

https://mushuichuan.com/2016/02/24/gson/

https://576017120.iteye.com/blog/1245134

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值