一、JSON简介
JSON:JavaScript Object Notation,JS对象简谱,是一种轻量级的数据交换格式。
JSON是相比于XML等其他复杂储存格式的一种轻量级的数据格式,可以通用与各个语言平台。常用方法为:交互、解析和储存数据。JSON常用于接口交互、前后端交互,其特点是解析速度快。JSON数据现在是我们开发中用的最多的,百分之九十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,并了解怎么快速解析它,从而提升开发效率。
二、JSON数据格式
什么是JSON数据:
{
"code":200,
"charge":false,
"msg":"查询成功",
"result":{
"personList":[
{
"name":"xxx",
"id":12333333,
"address":"xxx路xxx号"
},
{
"name":"yyy",
"id":13333333,
"address":"yyy路yyy号"
}
],
},
"searchPage":1,
"maxResult":20,
"ret_code":0
}
JSON数据就是一段字符串,只不过有不同意义的分隔符将其分割开。
格式:
- { } 一个大括号,表示一个对象。括号中描述对象的属性。通过键值对来描述对象的属性。
- 一个中括号,表示数组。数组中可以存放对象,也可以存放值。
- :冒号,键值的连接符
- ,逗号,多个键值对的分隔符
- " " 引号,键值对的键,必用引号引起(通常Java解析时,键不使用引号会报错。而JS能正确解析)。
- 键值对的值,可以是对象、数组、字符串(字符串放到引号中)或数字(数字不需要用引号)。
三、Java与JSON
在Java中,JSON需要做什么?
- 将Java中的对象快速转换为JSON格式的字符串。
- 将JSON格式的字符串,转换为Java对象。
四、使用Gson解析JSON数据
Gson是谷歌官方退出的支持JSON与Java Object相互转换的Java序列化/反序列化库。在使用之前需要在项目中导入Gson的jar包(maven工程需要在pom文件中配置依赖)。
1.对象转换为JSON字符串
先创建一个对象类,此处用Book类,类中有id、name和info属性。
import java.util.Objects;
public class Book {
private String id;
private String name;
private String info;
public Book() {
}
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
}
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(id, book.id) && Objects.equals(name, book.name) && Objects.equals(info, book.info);
}
@Override
public int hashCode() {
return Objects.hash(id, name, info);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
下面开始使用Gson,将对象转换为JSON字符串。
import com.google.gson.Gson;
import com.unitfore.lessoneight.object.Book;
public class GsonTools {
public static void main(String[] args) {
//创建gson对象
Gson gson = new Gson();
//创建Book对象
Book b = new Book("1001","三国演义","桃园三结义");
//将Book对象转换为Json字符串
String json = gson.toJson(b);
System.out.println(json);
}
}
运行结果:
"D:\Program Files\Java\jdk-11.0.6\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1\lib\idea_rt.jar=65407:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1\bin"
{"id":"1001","name":"三国演义","info":"桃园三结义"}
Process finished with exit code 0
通过创建Gson对象,使用Gson对象中的toJson(对象)方法,将字符串转换为Json字符串。
2.JSON字符串转为对象
依然简单
import com.google.gson.Gson;
import com.unitfore.lessoneight.object.Book;
public class GsonTools {
public static void main(String[] args) {
//创建gson对象
Gson gson = new Gson();
//创建Book对象
// Book b = new Book("1001","三国演义","桃园三结义");
Book book = gson.fromJson("{\"id\":\"1001\",\"name\":\"三国演义\",\"info\":\"桃园三结义\"}",Book.class);
//将Book对象转换为Json字符串
System.out.println(book.getId());
System.out.println(book.getName());
}
}
运行结果
"D:\Program Files\Java\jdk-11.0.6\bin\java.exe"
1001
三国演义
Process finished with exit code 0
3.JSON字符串转换为HashMap
解析一个复杂字符串:字符串属性中包含数组
{
"id":"10001",
"name":"三国演义",
"info":"桃园三结义",
"page":["刘关张","猪头","焚香"]
}
解析此Json
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.List;
public class GsonToHashMap {
public static void main(String[] args) {
Gson g = new Gson();
HashMap data = g.fromJson("{\n" +
"\t\"id\":\"10001\",\n" +
"\t\"name\":\"三国演义\",\n" +
"\t\"info\":\"桃园三结义\",\n" +
"\t\"page\":[\"刘关张\",\"猪头\",\"焚香\"]\n" +
"}",HashMap.class);
System.out.println(data.get("name").getClass());
System.out.println(data.get("page").getClass());
String name = (String)data.get("name");
System.out.println(name);
List page = (List)data.get("page");
System.out.println(page.get(1));
System.out.println(page.get(2));
}
}
在转换为HashMap后,id、name和info属性变成了String字符串,而page属性是一个数组,解析后变成了ArrayList集合。
"D:\Program Files\Java\jdk-11.0.6\bin\java.exe"
class java.lang.String
class java.util.ArrayList
三国演义
猪头
焚香
Process finished with exit code 0
五、使用FastJson解析JSON数据
FastJson是由alibaba工程师基于Java开发的一款JSON解析器和生成器,可用于将Java对象转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象。FastJson可以处理任意的Java对象,包括没有源代码的预先存在的对象。
同样的,使用前需要导入相应的jar包。
使用FastJson解析json,比Gson更为简单。下面来看代码:
import com.alibaba.fastjson.JSON;
import com.unitfore.lessoneight.object.Book;
import java.util.HashMap;
import java.util.List;
public class FastJsonDemo {
public static void main(String[] args) {
Book book = new Book("1001","水浒传","梁山聚义");
//对象转换字符串
String json = JSON.toJSONString(book);
System.out.println(json);
//json字符串转换为对象
Book b = JSON.parseObject(json,Book.class);
System.out.println(b.getName());
// json字符串转换为list["1","2","3"]
List<String> list = JSON.parseArray("[\"哎呀\",\"哦呀\",\"哇呀\"]",String.class);
System.out.println(list.get(2));
//json字符串转换成HashMap{"id":"10001","name":"三国演义","info":"桃园三结义","page":["刘关张","猪头","焚香"]}
HashMap data = JSON.parseObject("{\"id\":\"10001\",\"name\":\"三国演义\",\"info\":\"桃园三结义\",\"page\":[\"刘关张\",\"猪头\",\"焚香\"]}",HashMap.class);
List page = (List) data.get("page");
System.out.println(page.get(0));
}
}
使用FastJson解析,不需要创建响应的对象,直接使用静态方法JSON.toJSONString(对象);转换为json字符串,JSON.parseObject(json字符串,对象.class);转换为对象。
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1.1\lib\idea_rt.jar=9220:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1.1\bin"
{"id":"1001","info":"梁山聚义","name":"水浒传"}
水浒传
哇呀
刘关张
Process finished with exit code 0
六、总结
使用Gson解析
1. 使用Gson解析,导入jar包,或配置maven依赖
2. 创建Gson对象,new Gson()
3. 对象转换字符串: gson.toJson(对象);
4. json字符转对象: gson.fromJson("json字符串",Object.class);
使用FastJson解析
1. 导入jar包或配置maven依赖
2. 对象转换json:JSON.toJSONString(对象);
3. json字符转换对象:JSON.parseObject("json字符串",Object.class);
4. json字符串转换list: JSON.parseArray("json字符串",Object.class);
在开发中,根据实际需求进行选择。