Java JSON与对象转换
在现代Web开发中,JSON (JavaScript Object Notation) 已经成为数据交换的标准格式。对于Java开发者来说,掌握JSON与Java对象之间的转换技术是必不可少的技能。本文将详细介绍如何在Java中实现JSON与对象的相互转换。
什么是JSON?
JSON是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。它基于JavaScript语言的一个子集,但完全独立于编程语言。
JSON的基本结构包括:
- 对象:键值对集合,由花括号包围
{}
- 数组:值的有序列表,由方括号包围
[]
- 值:可以是字符串、数字、布尔值、对象、数组或null
例如:
{
"name": "John Doe",
"age": 30,
"isStudent": false,
"courses": ["Java", "Python", "JavaScript"],
"address": {
"city": "Shanghai",
"zipCode": "200000"
}
}
Java 处理JSON的常用库
Java生态系统中有多个处理JSON的库,最常用的包括:
- Jackson - 最流行的Java JSON处理库
- Gson - 由Google开发的JSON库
- JSON-B (JSON Binding) - Java EE标准
- org.json - 简单的JSON处理库
我们将主要介绍Jackson和Gson的使用,因为它们最为广泛使用。
使用Jackson进行JSON转换
Maven依赖
首先,添加Jackson依赖到你的项目中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.1</version>
</dependency>
Java 对象转JSON (序列化)
假设我们 有以下Java类:
public class Student {
private String name;
private int age;
private boolean active;
private List<String> courses;
// 构造函数、getter和setter方法省略
}
将Student对象转换为JSON:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonExample {
public static void main(String[] args) {
try {
// 创建ObjectMapper实例
ObjectMapper mapper = new ObjectMapper();
// 创建Student对象
List<String> courses = new ArrayList<>();
courses.add("Java");
courses.add("Spring Boot");
Student student = new Student();
student.setName("张三");
student.setAge(20);
student.setActive(true);
student.setCourses(courses);
// 将Java对象转换为JSON字符串
String jsonString = mapper.writeValueAsString(student);
System.out.println(jsonString);
// 将Java对象转换为JSON并写入文件
mapper.writeValue(new File("student.json"), student);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
{"name":"张三","age":20,"active":true,"courses":["Java","Spring Boot"]}
JSON转Java对象 (反序列化)
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonExample {
public static void main(String[] args) {
try {
ObjectMapper mapper = new ObjectMapper();
// JSON字符串
String jsonString = "{\"name\":\"张三\",\"age\":20,\"active\":true,\"courses\":[\"Java\",\"Spring Boot\"]}";
// 从JSON字符串转换为Java对象
Student student = mapper.readValue(jsonString, Student.class);
System.out.println("姓名: " + student.getName());
System.out.println("年龄: " + student.getAge());
System.out.println("课程: " + student.getCourses());
// 也可以从文件读取JSON
Student studentFromFile = mapper.readValue(new File("student.json"), Student.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
姓名: 张三
年龄: 20
课程: [Java, Spring Boot]
Jackson注解
Jackson提供了许多注解来控制JSON转换过程:
import com.fasterxml.jackson.annotation.*;
public class Student {
private String name;
@JsonProperty("studentAge") // 改变JSON字段名
private int age;
@JsonIgnore // 在JSON中忽略该字段
private String idNumber;
@JsonFormat(pattern = "yyyy-MM-dd") // 格式化日期
private Date birthDate;
// getter和setter方法
}
提示
使用适当的Jackson注解可以更好地控制JSON序列化和反序列化的行为,特别是在处理复杂对象或需要特殊格式时。
使用Gson进行JSON转换
Maven依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
Java 对象转JSON
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
// 创建Gson实例
Gson gson = new Gson();
// 创建Student对象
List<String> courses = new ArrayList<>();
courses.add("Java");
courses.add("Spring Boot");
Student student = new Student();
student.setName("李四");
student.setAge(22);
student.setActive(true);
student.setCourses(courses);
// 转换为JSON字符串
String jsonString = gson.toJson(student);
System.out.println(jsonString);
}
}
输出:
{"name":"李四","age":22,"active":true,"courses":["Java","Spring Boot"]}
JSON转Java对象
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
String jsonString = "{\"name\":\"李四\",\"age\":22,\"active\":true,\"courses\":[\"Java\",\"Spring Boot\"]}";
// 从JSON字符串转换为Java对象
Student student = gson.fromJson(jsonString, Student.class);
System.out.println("姓名: " + student.getName());
System.out.println("年龄: " + student.getAge());
}
}
输出:
姓名: 李四
年龄: 22