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数组
有时候我们想根据我们的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的简单使用就是这样啦,希望对你能有帮助!
源码下载
- Android 使用Gson解析Json和Json数组 一眼就能快速上手
- Android使用gson解析json
- Gson解析json数组
- Gson解析json数组
- gson解析json数组
- Gson解析json数组
- Gson解析Json数组
- gson解析json数组
- android开发之 Gson 解析json数组
- 使用Gson解析json 数组转对象
- 通过Json和Gson,快速生成和解析json字符串
- Android JSON Gson 解析
- Android Gson解析Json
- Android Gson 解析 Json
- Android json解析--GSON
- 使用Gson解析Json
- 使用Gson解析json
- 使用Gson解析json
- 在jQuery中 常用的选择器介绍
- hbase 的java操作
- 本地永久性保存NSUserDefaults
- React的双向绑定
- 30个最常用css选择器解析
- Android 使用Gson解析Json和Json数组 一眼就能快速上手
- 【JAVA】通过ISBN一键获取书籍信息
- (个人笔记)linux常见命令行
- 【Docker入门】快速入门教程
- 学习笔记----几个Oracle函数
- 让你很标准的看明白Hibernate的关联关系【一对一】【一对多】【多对一】【多对多】
- POJ 3177 Redundant Paths
- PAT (Advanced Level) Practise 1015
- 深入理解CSS中的层叠上下文和层叠顺序