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