1.JSON的概念
JSON,即JavaScript Object Notation的缩写,是一种轻量级的数据交换格式。
具有如下特点:
(1)易于人阅读和编写。
(2)易于机器解析和生成(网络传输速率)。
因此网络上传输数据经常用到它。
2.JSON的语法
要解析JSON,那么,熟悉JSON的语法还是很有必要的。
JSON 语法是 JavaScript 对象表示语法的子集。
- 数据在键值对中
- 键与值冒号分隔
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
JSON示例:
{
"programmers": [{
"firstName": "Brett",
"lastName": "McLaughlin",
"email": "aaaa"
}, {
"firstName": "Jason",
"lastName": "Hunter",
"email": "bbbb"
}, {
"firstName": "Elliotte",
"lastName": "Harold",
"email": "cccc"
}],
"authors": [{
"firstName": "Isaac",
"lastName": "Asimov",
"genre": "sciencefiction"
}, {
"firstName": "Tad",
"lastName": "Williams",
"genre": "fantasy"
}, {
"firstName": "Frank",
"lastName": "Peretti",
"genre": "christianfiction"
}],
"musicians": [{
"firstName": "Eric",
"lastName": "Clapton",
"instrument": "guitar"
}, {
"firstName": "Sergei",
"lastName": "Rachmaninoff",
"instrument": "piano"
}]
}
3.解析JSON的常用工具
(1)为了确保JSON数据是符合语法规则的。在获取到JSON数据后,我们可以先验证其合法性。验证网站很多。
(2)JSON解析常用两个框架
- Gson
- Jackson
- fastjson
如果数据量非常大,推荐使用Jackson或fastjson。
jar包百度云下载地址:Gson、Jackson和fastjson相关jar包百度云下载地址
4.Android Studio使用Gson解析JSON
Android Studio中使用Gson前可以先安装GsonFormat插件。
步骤如下:
- 首先,下载Gson.jar包。
- 然后,将Gson.jar包复制到工程app模块目录下的libs文件夹下。
- 右键jar包,选择Add as Library…,点击ok。
- 准备带解析的JSON字符串(通常情况下是网络获取,此处直接创建)。
- 使用GsonFormat插件将JSON字符串生成实体类。
- 最后,使用Gson解析JSON字符串为实体类对象。
GsonFormat插件安装:
打开File->Settings…->Plugins->Browse repositories…->搜索GsonFormat->选中->install->重启Android Studio。
JSON字符串示例:
{
"programmers": [{
"firstName": "Brett",
"lastName": "McLaughlin",
"email": "aaaa"
}, {
"firstName": "Jason",
"lastName": "Hunter",
"email": "bbbb"
}, {
"firstName": "Elliotte",
"lastName": "Harold",
"email": "cccc"
}],
"authors": [{
"firstName": "Isaac",
"lastName": "Asimov",
"genre": "sciencefiction"
}, {
"firstName": "Tad",
"lastName": "Williams",
"genre": "fantasy"
}, {
"firstName": "Frank",
"lastName": "Peretti",
"genre": "christianfiction"
}],
"musicians": [{
"firstName": "Eric",
"lastName": "Clapton",
"instrument": "guitar"
}, {
"firstName": "Sergei",
"lastName": "Rachmaninoff",
"instrument": "piano"
}]
}
GsonFormat使用说明:
- 复制JSON字符串内容;
- 新建一个空类,这里命名为Bean.java;
- 将光标放到空类中,使用快捷键Alt+Insert,选择GsonFormat。
- 弹出对话框,点击setting,勾选reuse entity,ok,粘贴JSON字符串内容,ok,ok;
生成实体类示例(为了方便展示,这里添加了toString()方法):
package gson.example.com.gsontest;
import java.util.List;
/**
* Created by Zz on 2015/9/9.
*/
public class Bean {
/**
* programmers : [{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}]
* authors : [{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}]
* musicians : [{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}]
*/
private List<ProgrammersEntity> programmers;
private List<AuthorsEntity> authors;
private List<MusiciansEntity> musicians;
public void setProgrammers(List<ProgrammersEntity> programmers) {
this.programmers = programmers;
}
public void setAuthors(List<AuthorsEntity> authors) {
this.authors = authors;
}
public void setMusicians(List<MusiciansEntity> musicians) {
this.musicians = musicians;
}
public List<ProgrammersEntity> getProgrammers() {
return programmers;
}
public List<AuthorsEntity> getAuthors() {
return authors;
}
public List<MusiciansEntity> getMusicians() {
return musicians;
}
public static class ProgrammersEntity {
/**
* firstName : Brett
* lastName : McLaughlin
* email : aaaa
*/
private String firstName;
private String lastName;
private String email;
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getEmail() {
return email;
}
@Override
public String toString() {
return "ProgrammersEntity{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
'}';
}
}
public static class AuthorsEntity {
/**
* firstName : Isaac
* lastName : Asimov
* genre : sciencefiction
*/
private String firstName;
private String lastName;
private String genre;
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setGenre(String genre) {
this.genre = genre;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getGenre() {
return genre;
}
@Override
public String toString() {
return "AuthorsEntity{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", genre='" + genre + '\'' +
'}';
}
}
public static class MusiciansEntity {
/**
* firstName : Eric
* lastName : Clapton
* instrument : guitar
*/
private String firstName;
private String lastName;
private String instrument;
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setInstrument(String instrument) {
this.instrument = instrument;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getInstrument() {
return instrument;
}
@Override
public String toString() {
return "MusiciansEntity{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", instrument='" + instrument + '\'' +
'}';
}
}
@Override
public String toString() {
return "Bean{" +
"programmers=" + programmers +
", authors=" + authors +
", musicians=" + musicians +
'}';
}
}
Gson解析代码示例:
private void convertJson() {
String json_str = "{\n" +
" \"programmers\": [{\n" +
" \"firstName\": \"Brett\",\n" +
" \"lastName\": \"McLaughlin\",\n" +
" \"email\": \"aaaa\"\n" +
" }, {\n" +
" \"firstName\": \"Jason\",\n" +
" \"lastName\": \"Hunter\",\n" +
" \"email\": \"bbbb\"\n" +
" }, {\n" +
" \"firstName\": \"Elliotte\",\n" +
" \"lastName\": \"Harold\",\n" +
" \"email\": \"cccc\"\n" +
" }],\n" +
" \"authors\": [{\n" +
" \"firstName\": \"Isaac\",\n" +
" \"lastName\": \"Asimov\",\n" +
" \"genre\": \"sciencefiction\"\n" +
" }, {\n" +
" \"firstName\": \"Tad\",\n" +
" \"lastName\": \"Williams\",\n" +
" \"genre\": \"fantasy\"\n" +
" }, {\n" +
" \"firstName\": \"Frank\",\n" +
" \"lastName\": \"Peretti\",\n" +
" \"genre\": \"christianfiction\"\n" +
" }],\n" +
" \"musicians\": [{\n" +
" \"firstName\": \"Eric\",\n" +
" \"lastName\": \"Clapton\",\n" +
" \"instrument\": \"guitar\"\n" +
" }, {\n" +
" \"firstName\": \"Sergei\",\n" +
" \"lastName\": \"Rachmaninoff\",\n" +
" \"instrument\": \"piano\"\n" +
" }]\n" +
"}";
Gson gson = new Gson();
try {
Bean bean = gson.fromJson(json_str, Bean.class);
Log.i("TAG", bean.toString());
}catch (JsonSyntaxException e) {
e.printStackTrace();
}
}
Gson解析结果示例:
09-09 13:59:28.728 4688-4688/? I/TAG﹕ Bean{programmers=[ProgrammersEntity{firstName='Brett', lastName='McLaughlin', email='aaaa'}, ProgrammersEntity{firstName='Jason', lastName='Hunter', email='bbbb'}, ProgrammersEntity{firstName='Elliotte', lastName='Harold', email='cccc'}], authors=[AuthorsEntity{firstName='Isaac', lastName='Asimov', genre='sciencefiction'}, AuthorsEntity{firstName='Tad', lastName='Williams', genre='fantasy'}, AuthorsEntity{firstName='Frank', lastName='Peretti', genre='christianfiction'}], musicians=[MusiciansEntity{firstName='Eric', lastName='Clapton', instrument='guitar'}, MusiciansEntity{firstName='Sergei', lastName='Rachmaninoff', instrument='piano'}]}
5.Android Studio使用Jackson解析JSON
步骤如下:
- 首先,下载jar包;
- 使用上面的工程;
- 导入jackson.jar包;
- 使用上面工程中的JSON字符串;
- 使用上面工程生成的实体类Bean;
- 使用Jackson进行解析。
注意:使用该jar包需要在app模块下的build.gradle中的android{}中添加如下代码:
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
否则,编译过程会报错。
JSON字符串还是上面的字符串;
实体类也还是上面的实体类;
Jackson解析代码示例:
private void jacksonConvertJson() {
String json_str = "{\n" +
" \"programmers\": [{\n" +
" \"firstName\": \"Brett\",\n" +
" \"lastName\": \"McLaughlin\",\n" +
" \"email\": \"aaaa\"\n" +
" }, {\n" +
" \"firstName\": \"Jason\",\n" +
" \"lastName\": \"Hunter\",\n" +
" \"email\": \"bbbb\"\n" +
" }, {\n" +
" \"firstName\": \"Elliotte\",\n" +
" \"lastName\": \"Harold\",\n" +
" \"email\": \"cccc\"\n" +
" }],\n" +
" \"authors\": [{\n" +
" \"firstName\": \"Isaac\",\n" +
" \"lastName\": \"Asimov\",\n" +
" \"genre\": \"sciencefiction\"\n" +
" }, {\n" +
" \"firstName\": \"Tad\",\n" +
" \"lastName\": \"Williams\",\n" +
" \"genre\": \"fantasy\"\n" +
" }, {\n" +
" \"firstName\": \"Frank\",\n" +
" \"lastName\": \"Peretti\",\n" +
" \"genre\": \"christianfiction\"\n" +
" }],\n" +
" \"musicians\": [{\n" +
" \"firstName\": \"Eric\",\n" +
" \"lastName\": \"Clapton\",\n" +
" \"instrument\": \"guitar\"\n" +
" }, {\n" +
" \"firstName\": \"Sergei\",\n" +
" \"lastName\": \"Rachmaninoff\",\n" +
" \"instrument\": \"piano\"\n" +
" }]\n" +
"}";
ObjectMapper mapper = new ObjectMapper();
try {
Bean bean = mapper.readValue(json_str, Bean.class);
Log.i("TAG", bean.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
Jackson解析结果:
09-09 15:10:39.818 31472-31472/gson.example.com.gsontest I/TAG﹕ Bean{programmers=[ProgrammersEntity{firstName='Brett', lastName='McLaughlin', email='aaaa'}, ProgrammersEntity{firstName='Jason', lastName='Hunter', email='bbbb'}, ProgrammersEntity{firstName='Elliotte', lastName='Harold', email='cccc'}], authors=[AuthorsEntity{firstName='Isaac', lastName='Asimov', genre='sciencefiction'}, AuthorsEntity{firstName='Tad', lastName='Williams', genre='fantasy'}, AuthorsEntity{firstName='Frank', lastName='Peretti', genre='christianfiction'}], musicians=[MusiciansEntity{firstName='Eric', lastName='Clapton', instrument='guitar'}, MusiciansEntity{firstName='Sergei', lastName='Rachmaninoff', instrument='piano'}]}
6.Android Studio使用fastjson解析JSON
步骤如下:
- 首先,下载jar包;
- 使用上面的工程;
- 导入fastjson.jar包;
- 使用上面工程中的JSON字符串;
- 使用上面工程生成的实体类Bean;
- 使用fastjson进行解析。
JSON字符串还是上面的字符串;
实体类也还是上面的实体类;
fastjson解析代码示例:
private void fastjsonConvertJson() {
String json_str = "{\n" +
" \"programmers\": [{\n" +
" \"firstName\": \"Brett\",\n" +
" \"lastName\": \"McLaughlin\",\n" +
" \"email\": \"aaaa\"\n" +
" }, {\n" +
" \"firstName\": \"Jason\",\n" +
" \"lastName\": \"Hunter\",\n" +
" \"email\": \"bbbb\"\n" +
" }, {\n" +
" \"firstName\": \"Elliotte\",\n" +
" \"lastName\": \"Harold\",\n" +
" \"email\": \"cccc\"\n" +
" }],\n" +
" \"authors\": [{\n" +
" \"firstName\": \"Isaac\",\n" +
" \"lastName\": \"Asimov\",\n" +
" \"genre\": \"sciencefiction\"\n" +
" }, {\n" +
" \"firstName\": \"Tad\",\n" +
" \"lastName\": \"Williams\",\n" +
" \"genre\": \"fantasy\"\n" +
" }, {\n" +
" \"firstName\": \"Frank\",\n" +
" \"lastName\": \"Peretti\",\n" +
" \"genre\": \"christianfiction\"\n" +
" }],\n" +
" \"musicians\": [{\n" +
" \"firstName\": \"Eric\",\n" +
" \"lastName\": \"Clapton\",\n" +
" \"instrument\": \"guitar\"\n" +
" }, {\n" +
" \"firstName\": \"Sergei\",\n" +
" \"lastName\": \"Rachmaninoff\",\n" +
" \"instrument\": \"piano\"\n" +
" }]\n" +
"}";
Bean bean = JSON.parseObject(json_str, Bean.class);
if (bean != null) {
Log.i("TAG", bean.toString());
}
}
fastjson解析结果:
22:28:05.060 20202-20202/gson.example.com.gsontest I/TAG﹕ Bean{programmers=[ProgrammersEntity{firstName='Brett', lastName='McLaughlin', email='aaaa'}, ProgrammersEntity{firstName='Jason', lastName='Hunter', email='bbbb'}, ProgrammersEntity{firstName='Elliotte', lastName='Harold', email='cccc'}], authors=[AuthorsEntity{firstName='Isaac', lastName='Asimov', genre='sciencefiction'}, AuthorsEntity{firstName='Tad', lastName='Williams', genre='fantasy'}, AuthorsEntity{firstName='Frank', lastName='Peretti', genre='christianfiction'}], musicians=[MusiciansEntity{firstName='Eric', lastName='Clapton', instrument='guitar'}, MusiciansEntity{firstName='Sergei', lastName='Rachmaninoff', instrument='piano'}]}
7.Eclipse使用Gson解析JSON
- 首先,下载Gson的jar包。
- 然后,新建一个Eclipse工程,这里我命名为TestGson。
- 将Gson.jar包复制到工程libs目录下。
- 将获取到的JSON字符串准备好。
- 根据JSON字符串写出对应的实体类(Java Bean)。
- 最后,使用Gson解析JSON字符串为实体类对象。
用法和Android Studio一样,不过实体类需要手写。
8.Eclipse使用Jackson解析JSON
- 首先,下载Jackson的三个jar包。
- 然后,新建一个Eclipse工程,这里我命名为TestJackson。
- 将Jackson的三个jar包复制到工程libs目录下。
- 将获取到的JSON字符串准备好。
- 根据JSON字符串写出对应的实体类(Java Bean)。
- 最后,使用Jackson解析JSON字符串为实体类对象。
用法和Android Studio一样,不过实体类需要手写。
9.Eclipse使用fastjson解析JSON
- 首先,下载fastjson的jar包。
- 然后,新建一个Eclipse工程,这里我命名为TestFastJson。
- 将fastjson.jar包复制到工程libs目录下。
- 将获取到的JSON字符串准备好。
- 根据JSON字符串写出对应的实体类(Java Bean)。
- 最后,使用fastjson解析JSON字符串为实体类对象。
用法和Android Studio一样,不过实体类需要手写。
10.总结
Gson,Jackson和fastjson三种框架解析JSON使用的代码都很简洁。
但是他们的性能还是有差别的。
根据网上说法,数据量较大时,解析速度应该是fastjson>Jackson>Gson。而且数据越大,差距越明显。