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

来源:互联网 发布:宝德网络培训怎么样 编辑:程序博客网 时间:2024/05/22 14:44

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的简单使用就是这样啦,希望对你能有帮助!

源码下载

原创粉丝点击