JSON是一个轻量级的数据格式,轻量级是相比较XML等其他复杂的存储格式而言,各个平台语言都支持JSON交互、JSON解析和存储。JSON常用于我们接口交互,前后端交互中,有解析速度快,方便的特点。因此学会JSON解析是非常重要的。
目录
一、JSON简介
简介:
JSON: JavaScript Object Notation ,JS对象简谱,是一种轻量级的数据交换格式。
JSON数据现在是我们开发中用的最多的,百分之九十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。
二、JSON数据格式
什么是JSON数据?
{
"code": "10000",
"charge": false,
"msg": "查询成功",
"result": {
"showapi_res_code": 0,
"showapi_res_error": "",
"showapi_res_body": {
"allNum": 7892,
"allPages": 395,
"contentlist": [
{
"ct": "2016-05-30 16:30:27.242",
"id": "574bfa236e36c1d5f9289678",
"img": "http://www.zbjuran.com/uploads/allimg/160530/2-160530145631924.gif",
"title": "要不要来个鸳鸯戏水呢",
"type": 3
},
{
"ct": "2016-05-30 16:30:27.239",
"id": "574bfa236e36c1d5f9289677",
"img": "http://www.zbjuran.com/uploads/allimg/160530/2-160530151R09B.gif",
"title": "翻滚的美少女",
"type": 3
}
],
"currentPage": 1,
"maxResult": 20,
"ret_code": 0
}
}
}
JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来。
格式:
-
{}
一个大括号,表示一个对象。括号中描述对象的属性。通过键值对来描述对象的属性。 -
[]
一个中括号,表示数组。数组中可以存放对象,也可以存放值。 -
:
冒号,键与值使用冒号连接。 -
,
逗号,多个键值对使用逗号分隔。 -
""
引号,键值对的键,应使用引号引起(通常Java解析时,键不使用引号会报错。而JS能正确解析)。 - 键值对的值,可以是对象、数组、字符串(字符串用
""
引号引住)或数字(数字不需要用引号)。
三、Java与JSON
在Java中需要做什么?
-
将 Java 中的对象,快速的转换为 JSON 格式的字符串。
-
将 JSON 格式的字符串,转换为 Java 对象。
四、使用Gson解析JSON数据
Gson是谷歌官方推出的支持 JSON -- Java Object
相互转换的 Java序列化/反序列化
库。在使用之前需要在项目中导入Gson的jar包。我使用的是 gson-2.8.6.jar。下载地址
点击这里即可下载
1. 对象转换为JSON字符串
先创建一个 Book
类,类中有id
、name
和info
属性。
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;
com.java.json.Book book = (com.java.json.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;
}
}
下面开始使用,我们先来将对象转换为JSON字符串。
import com.google.gson.Gson;
/**
* @Author: 网友小锋
* @Description: 使用 Gson 解析 json(谷歌)
* @Date Created in 2021-01-15 17:45
* @Modified By:
*/
public class DemoGson1 {
public static void main(String[] args) {
// 1. 创建Gson对象
Gson gson = new Gson();
// 2. 创建一个对象
Book b = new Book("1001", "金桃子", "种植桃子真辛苦");
// 对象转换为 json 字符串
String json = gson.toJson(b);
System.out.println(json);
}
}
运行结果:
先创建Gson对象Gson gson = new Gson();
,使用String json = gson.toJson(对象);
对象已被正确的转换为json字符串了,非常简单。
2. JSON字符串转换为对象
这个操作也非常简单。
import com.google.gson.Gson;
/**
* @Author: 网友小锋
* @Description: 使用 Gson 解析 json(谷歌)
* @Date Created in 2021-01-15 17:45
* @Modified By:
*/
public class DemoGson2 {
public static void main(String[] args) {
// 1. 创建Gson对象
Gson gson = new Gson();
// json 字符串转换为对象 {"id":"1001","name":"金桃子","info":"种植桃子真辛苦"}
Book book = gson.fromJson("{\"id\":\"1001\",\"name\":\"金桃子\",\"info\":\"种植桃子真辛苦\"}", Book.class);
System.out.println(book.getId());
System.out.println(book.getName());
}
}
使用Object obj = gson.fromJson("json字符串", Object.class);
json字符串转换为对象,同样也是没有任何的问题,可以拿到。
3. JSON字符串转换为HashMap
我们来解析一下稍微复杂一点的json字符串,在一个属性中加入数组。
{"id":"1001","name":"金桃子","info":"种植桃子真辛苦","page":["锄禾日当午","汗滴禾下土","床前明月光"]}
下面看解析代码
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.List;
/**
* @Author: 网友小锋
* @Description: 使用 Gson 解析 json(谷歌)
* @Date Created in 2021-01-15 17:45
* @Modified By:
*/
public class DemoGson3 {
public static void main(String[] args) {
// 1. 创建Gson对象
Gson g = new Gson();
// 2. json 字符串转换为 HashMap {"id":"1001","name":"金桃子","info":"种植桃子真辛苦","page":["锄禾日当午","汗滴禾下土","床前明月光"]}
HashMap data = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果的真辛苦\",\"page\":[\"锄禾日当午\",\"汗滴禾下土\",\"床前明月光\"]}", HashMap.class);
// name键值对是字符串
System.out.println(data.get("name").getClass());
// page键值对是 ArrayList集合
System.out.println(data.get("page").getClass());
// 获取name属性的值
String name = (String) data.get("name");
System.out.println(name);
// 获取page属性的值
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
集合。
五、使用FastJson解析JSON数据
FastJson是由阿里巴巴工程师基于Java开发的一款JSON解析器和生成器,可用于将Java对象
转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象。Fastjson可以
处理任意Java对象,包括没有源代码的预先存在的对象。
使用前需要在项目中导入FastJson的jar包,我使用的是的 fastjson-1.2.75.jar。下载地址。如果此链接失效,请去GitHub官网下载。
使用FastJson解析json比Gson更为简单。下面直接来看代码:
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.List;
/**
* @Author: 网友小锋
* @Description: 使用 FastJson 解析 json (阿里)
* @Date Created in 2021-01-15 18:07
* @Modified By:
*/
public class DemoFastJson {
public static void main(String[] args) {
Book book = new Book("1002","唐诗三百首","凝视地上霜");
// 1. 对象 转换为 json字符串
String json = JSON.toJSONString(book);
System.out.println(json);
// 2. json字符串 转换为 对象
Book b = JSON.parseObject(json, Book.class);
System.out.println(b.getName());
// json 字符串转换 list ["一二三","二三四","三四五"]
List<String> list = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]", String.class);
System.out.println(list.get(2));
// json 字符串转换为 HashMap {"id":"1001","name":"金桃子","info":"种植桃子真辛苦","page":["锄禾日当午","汗滴禾下土","床前明月光"]}
HashMap data = JSON.parseObject("{\"id\":\"1001\",\"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);
转换为对象。
六、总结
使用Gson解析
- 使用Gson解析,先导入jar包
gson-2.8.6.jar
- 创建Gson对象,
Gson gson = new Gson();
- 对象转换为 json 字符串,
String json = gson.toJson(对象);
- json 字符串转换为对象,
Object obj = gson.fromJson("json字符串", Object.class);
使用FastJson解析
- 使用FastJson解析,先导入jar包
fastjson-1.2.75.jar
- 对象转换为 json字符串,
String json = JSON.toJSONString(对象);
- json 字符串转换为对象,
Object obj = JSON.parseObject("json字符串", Object.class);
- json 字符串转换
list
,List<Object> list = JSON.parseArray("json字符串", Object.class);
如果在团队中需要你去选型,为了更好的融入团队,在国内建议使用FastJson,如果FastJson有安全隐患,则使用Gson。