JSON
简介:
- JSON全称是JavaScript Object Notation,js对象简谱。
- JSON是一种 轻量级、基于文本的数据交换格式。
- JSON十分便于阅读和书写,相比XML,文件更小,所以现在大部分开发人员都在使用JSON交换格式。
JSON语法格式
对象格式
-
一个对象,由一个大括号
{}
表示
– 括号描述对象的属性
– 通过键值对(name:value
)来描述对象的属性 -
格式:
键与值之间用冒号(:
)连接,多个键值对之间使用逗号(,
)分隔
键值对的键应使用引号""
引住(通常Java解析时,键不使用引号会报错,而JS能正确解析)
键值对的值,可以时JS中的任意类型的数据
案例:
接下来做一个对比:
java
中对象的格式:
class Book{
private String name;
private String info;
public void setName(String name) {
this.name = name;
}
public void setInfo(String info) {
this.info = info;
}
}
Book book = new Book();
book.setName("平凡的世界");
book.setInfo("展示了普通人在大时代历史进程中所走过的艰难曲折的道路");
XML
中对象的格式:
<book>
<name>平凡的世界</name>
<info>展示了普通人在大时代历史进程中所走过的艰难曲折的道路</info>
</book>
js
中对象的格式:
var book = new Object();
book.name = "平凡的世界";
book.info = "展示了普通人在大时代历史进程中所走过的艰难曲折的道路";
而JSON
的对象格式:
{
"name":"平凡的世界",
"info":"展示了普通人在大时代历史进程中所有走过的艰难曲折的道路"
}
数组格式
- 数组(Array)用方括号
[]
表示, - 在JSON格式中可以与对象相互嵌套
[元素1,元素2...]
案例:
{
"name":"小白",
"age":18,
"friend":["小红","小兰","小花",{
"name":"大白",
"info":"专注于java技术研究领域"
}]
}
Java与JSON
前面已经说了一些JSON的基础语法格式,那么到这里,就来说一下Java与JSON之间是做什么?
- 将Java中的对象,快速的转换为JSON格式的字符串。
- 将JSON格式的字符串,转换为Java的对象
在Java中用于解析JSON的库就目前来说还没有内置,这就需要外部去引入一些.jar包,在这里就介绍两个最常用的.jar包。
JSON解析包:Gson
和fastJson
Gson
什么是Gson?
Gson是谷歌官方推出的Java库,可用于将Java对象转换为其JSON表示。也可以用于将JSON字符串转换为等效的Java对象。Gson可以处理任意Java对象,包括您没有源代码的预先存在的对象。支持 JSON与Java对象相互转换的 Java序列化和反序列化 。
优点
- 提供简单的
toJson()
和fromJson()
方法,将Java对象到JSON,将JSON到Java对象 - 允许预先存在的不可修改对象与JSON相互转换
- 对Java泛型的广泛支持
- 允许对象的自定义表示
- 支持任意复杂的对象(具有深层继承层次结构和泛型类型的广泛使用)
下载
-
可百度搜索Gson,下载最新版本
-
或者点击链接:Gson的Github开源地址
找到Download,点击Gson jar downloads
3.在弹出另一个窗口,看到右边有个Downloads
点击,然后选择jar
4.如果在官网下载不了,也可在我的网盘下(目前最新版本为gson-2.8.7.jar):
链接:https://pan.baidu.com/s/1KnFancmRmDd8YJtvmYN1gA
提取码:9jrt
将对象转为JSON字符串
转换JSON字符串的步骤:
-
引入JAR包
具体引入可参考:其中有介绍如何引入jar包 -
在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
案例
import com.google.gson.Gson;
public class Demo {
public static void main(String[] args) {
//1. 创建Gson对象
Gson gson = new Gson();
//2. 对象 转换为 JSON
Book book = new Book(1001,"金苹果","种植苹果的心酸历程");
String s = gson.toJson(book);
System.out.println(s);//{"id":1001,"name":"金苹果","info":"种植苹果的心酸历程"}
}
static class Book {
private int id;
private String name;
private String info;
public Book() {
}
public Book(int 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 + '\'' +
'}';
}
}
}
将JSON字符串转换为对象
步骤
-
引入JAR包
-
在需要转换Java对象的位置,编写如下代码:
对象 = new GSON().fromJson(JSON字符串,对象类型.class);
案例
import com.google.gson.Gson;
import java.awt.print.Book;
public class Demo1 {
public static void main(String[] args) {
//1. 创建Gson对象
Gson gson = new Gson();
//2. 转换 {"id":1001,"name":"金苹果","info":"种植苹果的心酸历程"} 为 对象
Book book = gson.fromJson("{\"id\":1001,\"name\":\"金苹果\",\"info\":\"种植苹果的心酸历程\"}", Book.class);
System.out.println(book);//Book{id=1001, name='金苹果', info='种植苹果的心酸历程'}
}
}
将JSON字符串转换为集合
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.List;
public class Demo3 {
public static void main(String[] args) {
//1. 创建Gson对象
Gson gson = new Gson();
//2. 转换 {"id":1001,"name":"金苹果","info":"种植苹果的心酸历程","page":["锄禾日当午","汗滴禾下土","谁知盘中餐","粒粒皆辛苦"]} 为集合
HashMap map = gson.fromJson(
"{\"id\":1001," +
"\"name\":\"金苹果\"," +
"\"info\":\"种植苹果的心酸历程\"," +
"\"page\":[\"锄禾日当午\"," +
"\"汗滴禾下土\"," +
"\"谁知盘中餐\"," +
"\"粒粒皆辛苦\"]}",
HashMap.class);
System.out.println(map);//{name=金苹果, id=1001.0, page=[锄禾日当午, 汗滴禾下土, 谁知盘中餐, 粒粒皆辛苦], info=种植苹果的心酸历程}
System.out.println(map.get("page"));//[锄禾日当午, 汗滴禾下土, 谁知盘中餐, 粒粒皆辛苦]
System.out.println(map.get("page").getClass());//class java.util.ArrayList
List page = (List) map.get("page");
System.out.println(page.get(1));//汗滴禾下土
}
}
fastJson
什么是fastJson?
fastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
fastJson的优点
- 速度快:相对其它JSON库的特点是快。
- 使用广泛:fastJson在阿里巴巴大规模使用,在数万台服务器上部署,在业界被广泛接受。
- 测试完备:fastJson有非常多的testcase,在1.2.11版本中,testcase超过3321个。
- 使用简单:fastJson的API十分简洁。
String text = JSON.toString(obj);//序列化
VO vo = JSON.parseObject("{…}",VO.class);//反序列化
- 功能完备:支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。
fastJson下载
-
也可以百度搜索fastJson,如下图:
-
载GitHub页面滑到下面,找到Download点击the latest JAR即可下载最新版本
-
如果下载不了,可以复制下面链接提取(目前最新版本fastjson-1.2.78.jar)
链接:https://pan.baidu.com/s/1IRPPzz2L4auCrAXZM7Nm0w
提取码:rrp8
将对象转换为JSON字符串
转换JSON字符串的步骤
- 引入JAR包
- 在需要转换JSON字符串的位置编写如下代码即可:
String json = JSON.toJSONString(要转换的对象);
案例
import com.alibaba.fastjson.JSON;
public class Demo4 {
public static void main(String[] args) {
Book book = new Book(1002,"平凡的世界","展示了普通人在大时代历史进程中所走过的艰难曲折的道路");
//1. 转换
String json = JSON.toJSONString(book);
System.out.println(json);
//打印:{"id":1002,"info":"展示了普通人在大时代历史进程中所走过的艰难曲折的道路","name":"平凡的世界"}
}
}
.
将JSON字符串转换为对象
- 引入JAR包
- 在需要转换Java对象的位置,编写如下代码:
类型 对象名 = JSON.parseObject(JSON字符串,类型.class);
案例
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class Demo5 {
public static void main(String[] args) {
//1. 转换
//{"id":1002,"info":"展示了普通人在大时代历史进程中所走过的艰难曲折的道路","name":"平凡的世界"}
Book book = JSON.parseObject("{\"id\":1002,\"info\":\"展示了普通人在大时代历史进程中所走过的艰难曲折的道路\",\"name\":\"平凡的世界\"}",Book.class);
System.out.println(book);//Book{id=1002, name='平凡的世界', info='展示了普通人在大时代历史进程中所走过的艰难曲折的道路'}
System.out.println(book.getId());//1002
System.out.println(book.getName());//平凡的世界
System.out.println(book.getInfo());//展示了普通人在大时代历史进程中所走过的艰难曲折的道路
}
}
将JSON字符串转换为集合
import com.alibaba.fastjson.JSON;
import java.util.List;
public class Demo6 {
public static void main(String[] args) {
//1. 转换 ["床前明月光","疑是地上霜","举头望明月","低头思故乡"]
List<String> array = JSON.parseArray("[\"床前明月光\",\"疑是地上霜\",\"举头望明月\",\"低头思故乡\"]", String.class);
System.out.println(array.get(0));//床前明月光
System.out.println(array);//[床前明月光, 疑是地上霜, 举头望明月, 低头思故乡]
}
}
总结
- 当要使用谷歌的JSON解析库时,只需引入Gson库
- 当要使用阿里巴巴的JSON解析库时,只需引入fastJson库
- 最好下载最新版本的jar包
- 关于Gson与fastJson的选择:Gson相对稳定,fastJson在国内使用广泛
相关链接:这里有关于引入jar包的具体步骤