Android 使用Gson解析Json和Json数组 一眼就能快速上手

Gson是google提供的用于快速解析Json的工具,使用非常广泛。如果你要用到Gson来解析,那我相信你应该了解什么是Json、什么是Json数组以及它们的格式了,那我就不细说了。下面直接展示如何使用Gson进行解析Json和Json数组。

一、介绍和准备工作


先来看看程序运行的界面,从上往下四个按钮,前两个分别是对一个Json的字符串、一个Json数组的字符串进行解析并转换为对应的Java对象(JavaBean),并显示在TextView中。后两个按钮是相反的过程,把Java对象转变为Json字符串,然后Toast出来。




程序运行概览

首先,添加GSON依赖,在app-build.gradle中添加依赖如下:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'

    //添加Gson依赖
    compile 'com.google.code.gson:gson:2.8.1'
}

在我们的例子中,我们会先后对Json和Json数组进行解析,以下分别是json.txt和jsonarray.txt,分别代表需要解析的Json数据源和Json数组数据源,这两个文件我保存在assets目录中。

json.txt:

{
"name":"Tom",
"age":13,
"school":"T-school",
"address":{"province":"广东","city":"惠州"}
}

注意在json.txt中,有个键值对:”adress”,adress对应的也是一个Json。

jsonarray.txt:

[
{
"name":"Tom",
"age":13,
"school":"T-school",
"address":{"province":"广东","city":"惠州"}
},
{
"name":"John",
"age":15,
"school":"J-school",
"address":{"province":"广东","city":"广州"}
}
]

这里我们需要创建一个名为Student的Java类,属性包括name、age、school和address,注意属性名要和json.txt中的键名称保持一致。
虽然不一致的话不会导致解析错误,但是会导致你自定义的属性会被置为null值
这也有一个好处就是:你可以只定义自己需要的属性,比如我不需要school属性,就可以不用写到Student类中了。

Student.java:

public class Student {
    private String name;
    private int age;
    private String school;
    private Address address;

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

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

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

    public void setSchool(String school) {
        this.school = school;
    }

    public Address getAddress() {
        return address;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public String getSchool() {
        return school;
    }

    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder();
        sb.append("\"name\": ").append(name).append(",\n")
                .append("\"age\": ").append(age).append(",\n")
                .append("\"school\": ").append(school).append(",\n")
                .append("\"address\": ").append(address).append('\n');

        return sb.toString();
    }
}

上面提到过,json.txt中的Json里面还包含了另一个Json,assdress:

"address":{"province":"广东","city":"惠州"}

因此我们还需要再定义一个JavaBean类,即Adress类:
Adress.java:

public class Address {
   private  String province;private String city;

    public void setCity(String city) {
        this.city = city;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public String getProvince() {
        return province;
    }

    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder();
        sb.append("\"province\": ").append(province).append(", \"city\": ").append(city).append('\n');
        return sb.toString();
    }
}

我重写了两个JavaBean的toString()函数,为的是方便进行输出。

二、解析Json和Json数组



把json.txt里面的Json解析为Student对象并显示在TextView中,注释很清晰了,不赘述了。

    Student student=null;
    /**
     * 将Json String转变为对应的Json对象
     */
    private void parseJson() {
        //耗时操作放在新线程中
        new Thread(new Runnable() {
            @Override
            public void run() {
                //文件放在assets文件夹中,需要使用AssetManager读取json.txt
                AssetManager am = getAssets();
                StringBuilder json = new StringBuilder();
                try {
                    //使用gbk作为编码方式
                    BufferedReader reader = new BufferedReader(new InputStreamReader(am.open("json.txt"), "gbk"));
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        json.append(line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

                if (json.length() != 0) {
                    //json.toString()就是得到的json字符串了,将它转为Student对象
                    student = new Gson().fromJson(json.toString(), Student.class);

                    //Handler更新tv
                    Message msg = new Message();
                    msg.obj = student.toString();
                    handler.sendMessage(msg);
                }

            }
        }).start();
    }

把jsonarray.txt中的Json数组转变为Student的链表:List:

    List<Student> students;
    /**
     * 将Json数组的String转变为Json Array
     */
    private void parseJsonArray() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                AssetManager am = getAssets();
                StringBuilder json = new StringBuilder();
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(am.open("jsonarray.txt"), "gbk"));
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        json.append(line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

                if (json.length() != 0) {
                    //将json.toString()转变为List<Studnet>
                    Type type = new TypeToken<List<Student>>() {
                    }.getType();
                    students = new Gson().fromJson(json.toString(), type);

                    Message msg = new Message();
                    msg.obj = students.toString();
                    handler.sendMessage(msg);
                }

            }
        }).start();
    }

运行结果如下:




解析Json



解析Json数组

 三、生成Json



有时候我们想根据我们的JavaBean生成Json字符串在网络上传输,这时候使用Gson也是很方便的。
例如我们有个对象:

new Student("Tom",13, "T-school", new Adress("广东", "惠州"));

转换为Json后就可以得到如下的Json字符串:

{
"name":"Tom",
"age":13,
"school":"T-school",
"address":{"province":"广东","city":"惠州"}
}

现在把我们刚刚生成的Student对象转换为Json并Toast出来:

   /**
     * 将Json对象转变为Json String
     */
    private void toJson() {
        if (student == null) return;

        Type type = new TypeToken<Student>() {
        }.getType();
        String json = new Gson().toJson(student, type);
        Toast.makeText(this, json, Toast.LENGTH_LONG).show();
    }

同理,把students也转变为Json:

  /**
     * 将Json数组转变为对应的String
     */
    private void toJsonArray() {
        if (students == null) return;

        Type type = new TypeToken<List<Student>>() {
        }.getType();
        String json = new Gson().toJson(students, type);
        Toast.makeText(this, json, Toast.LENGTH_LONG).show();
    }

运行结果:




生成Json

Gson的简单使用就是这样啦,希望对你能有帮助!

源码下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值