最近移动开发课程学到了JSON解析,想起去年十月一的时候,老班问我有没有用过OkHttp,有没有用过网上的开放接口解析JSON创建自己的APP,当时听得一脸懵逼啊。之后深觉需要发粪学习,直至今日,还是菜鸡一枚~(@^_^@)~
好在Android开发的基础知识还是及时补上了,对于JSON解析,也是用过挺多次的了,是时候做个总结了。写的简单点,希望以前没了解过的童鞋能很轻松的从这篇博客里初步认识JSON,并学会去解析各种各样JSON格式的数据。
1. 那么什么是JSON呢?为什么要用JSON格式传递数据?
JSON是一种取代XML的数据交换格式,是相较于XML,JSON的数据文件更小,但表达能力却丝毫不弱。正因为它的小巧,在网络传输中,将需要更少的流
量,从而也可以加快传输速度。
JSON就是一个字符串,只不过对象以及对象的元素(值)会使用特定的符号标注。下面简单看下JSON的语法:
{} // 双括号内表示一个对象
[] // 中括号内表示一个数组
"" // 双引号内表示属性或值
: // 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
完整的JSON格式的数据,是这样的:
{"city":"Beijing","street":"Chaoyang Road","postcode":"100025","delicacy":["烤鸭","炸酱面"]}
其中需要注意的是,Object(对象)可以嵌套表示,如下:
{"name":"Michael","address":{"city":"Beijing","street":"Chaoyang Road","postcode":100025}}
先来看下我们要用的JSON数据
{
"name": "liweiyong",
"age": "100",
“phone”: [
"12345678",
"87654321"
],
"address": {
"province": "jiangsu",
"country": "china"
},
"married": false
}
2. 如何用Java代码构建一个JSON格式的数据?
废话不多说,直接看代码(别人跟我讨论什么问题,我就喜欢直接上代码, 理解起来会更快)
// 生成JSON
private JSONObject createJSONObject1() {
JSONObject person = new JSONObject(); // 首先创建一个JSONObject 对象(person)
try {
person.put("name", "liweiyong"); // 在 person 中按照"键值"对应添加数据
person.put("age", 100);
JSONArray phone = new JSONArray(); // 创建一个JSONArray(数组)存储两个手机号码
phone.put("12345678"); // 向 JSONArray 中按照"键值"对应关系填入数据
phone.put("87654321");
person.put("phone", phone); // 将数组添加到 person 对象中
JSONObject address = new JSONObject(); // 创建一个新的 JSONObject 对象(address),存储家庭住址信息
address.put("country", "china"); // address 添加国家
address.put("province", "jiangsu"); // 添加省份
person.put("address", address); // 将 address 对象添加到 person 对象中,即嵌套对象
person.put("married", false);
} catch (JSONException e) {
e.printStackTrace();
}
return person;
}
上面每行代码几乎我都写了注释,稍微有一点Java基础的人相信也能一眼看得懂吧。
3. 如何用解析JSON格式的数据?
上代码!
// 解析JSON
private String parseJSONObject1(String t) {
// 使用 StringBuilder 比 String 拼接字符串效率更高
StringBuilder date = new StringBuilder();
try {
JSONObject jsonObj = new JSONObject(t); // 将需要解析的JSON数据构建成JSONObject
String name = jsonObj.getString("name"); // 使用 getString(键) 方法得到 name 值
int age = jsonObj.getInt("age"); // 使用 getInt(键) 方法得到 name 值
JSONArray phone = jsonObj.getJSONArray("phone"); // 使用 getJSONArray(键) 得到 phone 数组
String[] phones = new String[phone.length()]; // 创建 phones 数组存储电话号码
for (int i = 0; i < phone.length(); i++) { // 对 phone 进行遍历
phones[i] = phone.get(i).toString();
}
JSONObject address = jsonObj.getJSONObject("address"); // 使用 getJSONObject(键) 得到嵌套的 address 对象
String country = address.getString("country"); // 下面类似,无非都是用 get 方法获取各种类型的数据
String province = address.getString("province");
Boolean married = jsonObj.getBoolean("married");
// 将上面获取到的数据拼接成字符串
date.append("name:" + " ");
date.append(name);
date.append("\n");
date.append("age:" + " ");
date.append(age);
date.append("\n");
date.append("phone:" + " ");
for (int i = 0; i < phones.length; i++) {
date.append(phones[i] + " ");
}
date.append("\n");
date.append("address:" + " ");
date.append(country + " ");
date.append(province);
date.append("\n");
date.append("married:" + " ");
date.append(married);
} catch (JSONException e) {
e.printStackTrace();
}
return date.toString();
}
还是很简单的吧,JSON解析无非就是先用JSON格式的字符串构建成JSONObject对象,然后再通过这个对象的get方法取出各种类型的值,数组,对象。
4. 不得不说的 Gson
文章上面的解析和构建JSON步骤有没有发现非常繁琐,如果要把JSON数据转化为一个实体对象,还要新建对象,为每个属性单独赋值,步骤会更多,使
用GOSN就可以将原本繁杂的步骤变得异常简洁。
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。简
单就是说,通过Gson,你可以将一个Java实体对象直接转化为JSON,JSON也可以直接转化为一个Java实体对象。
要用Gson构建和解析JSON,需要新建一个Bean(实体对象类),而且这个Bean文件内容要和JSON数据类型一一对应。
使用Gson构建JSON
使用GSON最关键的是创建一个或多个合适的Bean,我这里给个例子,好好体会 O(∩_∩)O ,还是用上面的JSON数据,我把它拿下来,方便看着理解我建的Bean。
{
"name": "liweiyong",
"age": "100",
“phone”: [
"12345678",
"87654321"
],
"address": {
"province": "jiangsu",
"country": "china"
},
"married": false
}
这个JSON数据外面一个Object,内部还嵌套着一个名为address的Object,先建里面的address类。
package com.example.sunny.practice_217;
/**
* Created by Sunny on 2017/2/18.
* Email:670453367@qq.com
* Description: Address 实体类
*/
public class Address {
private String province;
private String country;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
类的名称随意,但里面的属性名必须和JSON中相应的字段一致,这样Gson解析的时候才能一一映射。还有外面的类,下面代码:
package com.example.sunny.practice_217;
/**
* Created by Sunny on 2017/2/18.
* Email:670453367@qq.com
* Description: Person 实体类
*/
public class Person {
private String name;
private int age;
private String[] phone;
private Boolean married;
private Address address;
public Person() {}
public Person(String name, int age, String[] phone, Boolean married) {
this.name = name;
this.age = age;
this.phone = phone;
this.married = married;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String[] getPhone() {
return phone;
}
public void setPhone(String[] phone) {
this.phone = phone;
}
public Boolean getMarried() {
return married;
}
public void setMarried(Boolean married) {
this.married = married;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
注意Person属性里有一句“private Address address;”,然后address还有一个get方法和一个set方法。这样,就把Address嵌套在Person类里。和我
们的JSON数据相匹配了。
剩下的构建和解析就很简单了。注意以下两句就行。
String json = new Gson().toJson(person, Person.class); // 传入一个实体化对象和类的这个类,构建一个JSON格式的字符串
Person person = new Gson().fromJson(json2, Person.class); // 传入一个JSON格式的字符串数据和实体类,解析成一个实体类对象
就这两句足够了,Gson难就难在怎么根据数据构建出合适的Bean,构建解析只一句话搞定。下面是我写的完整的构建和解析方法。
// 通过 Gson 将 Person 对象实体化为 JSON
private String ByGson() {
// 创建对象,给对象属性赋值
Person person = new Person();
person.setAge(100);
person.setName("liweiyong");
person.setMarried(false);
person.setPhone(new String[]{"12345678", "87654321"});
Address address = new Address();
address.setProvince("jiangsu");
address.setCountry("china");
person.setAddress(address);
// 使用toJson()构建JSON
String json = new Gson().toJson(person, Person.class);
return json;
}
// 将 JSON 解析成 Person 实体对象
private Person parseJSONObjectByGson(String json2) {
// 用fromJson()将JSON字符串转化为Person对象
Person person = new Gson().fromJson(json2, Person.class);
return person;
}
其实XML和JSON解析都类似,学会了JSON解析,XML解析上网查查博客也就差不多,而且现在XML用的越来越少,基本都是使用JSON,学会JSON解析,是每
个程序员的基础课程。希望看到这里的人,能从此篇博客当中有所收获。
由于个人水平有限,文章所介绍的知识有错误和不准确的地方,欢迎大家在下面留言区指出,与君共勉,一起进步。
下面按钮你不“顶”一下吗? 哈哈哈······