一、概述
JSON(JavaScript Object Notation),一种轻量级的数据交换格式,尤其是作为前后端数据传输的标准格式,易于阅读和编写,独立于编程语言,使得JSON在Web开发中非常流行,。
在Java中,JSON广泛用于网络通信、配置文件、数据存储等场景。开发者通常会使用第三方库来解析和生成JSON数据。
JSON官网:JSON
二、JSON格式支持的两种结构
1.名称/值对集合(对象)(其实就是键值对)
JSON中,名称/值对集合被表示为一组由花括号 {}
包围的键值对。每个键值对由一个键(名称)和一个值组成。
键必须是字符串,并且用双引号包围,
值可以是字符串、数字、布尔值、数组、对象或者null。
键和值之间用冒号 :
分隔,而键值对之间用逗号 ,
分隔。
json对象例子:
{
"name": "宝宝",
"age": 18,
"isStudent": true,
"height": null,
"contact": {
"email": "zhangsan@example.com",
"phone": "123-456-7890"
},
"hobbies": ["阅读", "旅游", "摄影"]
}
2.字符串格式
整个JSON数据结构被序列化为一个字符串。通常是在数据需要通过网络传输或存储到文本文件中时的格式。在JSON字符串中,特殊字符比如双引号必须被转义。
String jsonString = "{\n" +
" \"name\": \"宝宝\",\n" +
" \"age\": 18,\n" +
" \"isStudent\": true,\n" +
" \"height\": null,\n" +
" \"contact\": {\n" +
" \"email\": \"zhangsan@example.com\",\n" +
" \"phone\": \"123-456-7890\"\n" +
" },\n" +
" \"hobbies\": [\"阅读\", \"旅游\", \"摄影\"]\n" +
"}";
3.有序的值列表(数组)
JSON数组是由方括号 []
包围的值的有序集合。
数组中的值可以是任何类型,包括字符串、数字、布尔值、数组、对象或null。
数组中的值用逗号 ,
分隔。
json数组例子
[
{
"title": "发光发热",
"author": {
"firstName": "图图",
"lastName": ""
},
"published": true,
"publishDate": "2013-12-01",
"genres": ["技术", "编程", "Web开发"],
"ratings": [
{"user": "Alice", "score": 5},
{"user": "Bob", "score": 4},
{"user": "Carol", "score": 4.5}
]
},
{
"title": "JavaScript高级程序设计",
"author": {
"firstName": "Nicholas",
"lastName": "Zakas"
},
"published": true,
"publishDate": "2020-09-23",
"genres": ["技术", "编程", "前端开发"],
"ratings": [
{"user": "Dave", "score": 5},
{"user": "Eve", "score": 4.8}
]
},
{
"title": "未来简史",
"author": {
"firstName": "尤瓦尔",
"lastName": "赫拉利"
},
"published": true,
"publishDate": "2017-02-21",
"genres": ["历史", "科学", "哲学"],
"ratings": [
{"user": "Frank", "score": 4.7},
{"user": "Grace", "score": 4.9},
{"user": "Heidi", "score": 4.6}
]
}
]
三、JSON序列化
JSON序列化是一个将数据结构或对象状态转换为JSON格式字符串的过程。
JSON序列化的结果是一个字符串
四、JSON反序列化
JSON反序列化是一个将JSON格式的字符串转换回原始的数据结构或对象的过程。
五、JSON常用方法
Java中,处理JSON数据通常需要使用第三方库,因为Java标准库本身并不直接支持JSON。
1.Jackson是一个高性能的JSON处理库,主要通过ObjectMapper
类来实现序列化和反序列化。常用方法:
writeValueAsString(Object value)
: 将Java对象序列化为JSON字符串。 readValue(String content, Class<T> valueType)
: 将JSON字符串反序列化为Java对象。
readValue(File src, Class<T> valueType)
: 从文件中读取JSON字符串并反序列化为Java对象。
writeValue(File resultFile, Object value)
: 将Java对象序列化为JSON字符串并保存到文件。
2.
Fastjson是阿里巴巴的一个开源JSON库,以高性能和易用性著称,常用方法:
JSON.toJSONString(Object object)
: 将Java对象序列化为JSON字符串。
JSON.parseObject(String text, Class<T> clazz)
: 将JSON字符串反序列化为Java对象。
JSON.parseArray(String text, Class<T> clazz)
: 将JSON字符串反序列化为特定类型的对象列表。
JSON.parse(String text)
: 将JSON字符串反序列化为一个JSON对象或JSONArray,但不指定具体的类型。
六、常用JSON库
Java中,JSON序列化可以通过各种库来实现,比如Jackson、Gson、Fastjson等
1.使用Jackson库
1.1添加依赖
添加Jackson库到项目中,如果使用Maven,在pom.xml
文件中添加依赖
<dependencies>
<!-- 添加Jackson的jackson-databind依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version> <!-- 使用最新的稳定版本号 -->
</dependency>
</dependencies>
1.2JSON序列化
import com.fasterxml.jackson.databind.ObjectMapper;
// 假设我们有一个简单的Java对象
class Person {
private String name;
private int age;
// 构造函数、getter和setter省略
}
public class JsonSerializationExample {
public static void main(String[] args) {
// 创建一个Person对象
Person person = new Person();
person.setName("Alice");
person.setAge(25);
try {
// 创建ObjectMapper实例
ObjectMapper mapper = new ObjectMapper();
// 将person对象转换为JSON字符串
String jsonString = mapper.writeValueAsString(person);
// 输出JSON字符串
System.out.println(jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.3JSON反序列化
import com.fasterxml.jackson.databind.ObjectMapper;
// 假设我们有一个与JSON数据对应的Java类
class Person {
private String name;
private int age;
private String email;
// 构造函数、getter和setter省略
}
public class JsonDeserializationExample {
public static void main(String[] args) {
// JSON字符串
String jsonString = "{\"name\":\"张三\",\"age\":30,\"email\":\"zhangsan@example.com\"}";
try {
// 创建ObjectMapper实例
ObjectMapper mapper = new ObjectMapper();
// 将JSON字符串转换为Person对象
Person person = mapper.readValue(jsonString, Person.class);
// 输出转换后的对象
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
System.out.println("Email: " + person.getEmail());
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.使用Fastjson库(常用)
2.1添加依赖
添加Fastjson库到项目中,如果使用Maven,在pom.xml
文件中添加以下依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version> <!-- 可以使用最新的版本号 -->
</dependency>
2.2JSON序列化
public class Person {
private String name;
private int age;
private String email;
// 构造函数、getter和setter方法
public Person() {}
public Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// getter 和 setter 方法
// ...
}
import com.alibaba.fastjson.JSON;
public class FastjsonSerializationExample {
public static void main(String[] args) {
// 创建Person对象
Person person = new Person("张三", 30, "zhangsan@example.com");
// 使用Fastjson的JSON类的toJSONString方法将Person对象序列化成JSON字符串
String jsonString = JSON.toJSONString(person);
// 输出JSON字符串
System.out.println(jsonString);
}
}
2.3JSON反序列化
import com.alibaba.fastjson.JSON;
public class FastjsonDeserializationExample {
public static void main(String[] args) {
// JSON字符串
String jsonString = "{\"name\":\"张三\",\"age\":30,\"email\":\"zhangsan@example.com\"}";
// 使用Fastjson的JSON类的parseObject方法将JSON字符串反序列化成Person对象
Person person = JSON.parseObject(jsonString, Person.class);
// 输出反序列化后的对象信息
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
System.out.println("Email: " + person.getEmail());
}
}