Java中引入和使用JSON的全面指南
Java中引入和使用JSON的全面指南:从基础库到第三方工具
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因易读性强、解析高效等优点,已成为Java开发中与前后端交互、配置文件存储、数据序列化等场景的核心工具,本文将详细介绍Java中引入和使用JSON的多种方式,涵盖标准库、主流第三方工具(如Gson、Jackson、Fastjson)及Spring Boot内置支持,帮助开发者根据实际需求选择合适的方案。
Java标准库:org.json
Java标准库从Java EE 7开始引入了javax.json包(后迁移至jakarta.json),提供了基础的JSON处理能力,无需额外依赖,适合轻量级场景。
1 引入依赖
若使用Java EE 8+或Jakarta EE 8+,可直接通过JDK模块加载(需JDK 9+模块化支持);若使用早期版本,需添加以下依赖(以Maven为例):
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.json</artifactId>
<version>2.0.1</version>
</dependency>
2 基本使用
(1)创建JSON对象
import jakarta.json.Json;
import jakarta.json.JsonObject;
import jakarta.json.JsonReader;
// 创建JSON对象
JsonObject jsonObject = Json.createObjectBuilder()
.add("name", "张三")
.add("age", 25)
.add("isStudent", true)
.add("courses", Json.createArrayBuilder()
.add("Java")
.add("Python")
.build())
.build();
// 输出JSON字符串
System.out.println(jsonObject.toString());
// 输出:{"name":"张三","age":25,"isStudent":true,"courses":["Java","Python"]}
(2)解析JSON字符串
String jsonStr = "{\"name\":\"李四\",\"age\":30,\"city\":\"北京\"}";
try (JsonReader reader = Json.createReader(new StringReader(jsonStr))) {
JsonObject parsedObject = reader.readObject();
String name = parsedObject.getString("name");
int age = parsedObject.getInt("age");
System.out.println("姓名:" + name + ",年龄:" + age);
// 输出:姓名:李四,年龄:30
}
3 优缺点
- 优点:无需额外依赖,适合简单JSON操作;
- 缺点:功能有限(如不支持注解解析/生成)、API较为底层,复杂对象处理繁琐。
第三方工具:Gson(Google)
Gson是Google推出的JSON处理库,以简洁的API和强大的对象映射能力著称,适合需要灵活处理Java对象与JSON互转的场景。
1 引入依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
2 基本使用
(1)Java对象转JSON(序列化)
import com.google.gson.Gson;
class User {
private String name;
private int age;
// 必须有无参构造方法
public User() {}
public User(String name, int age) {
this.name = name;
this.age = age;
}
// Getter/Setter(可省略,Gson通过反射访问字段)
public String getName() { return name; }
public int getAge() { return age; }
}
public class GsonDemo {
public static void main(String[] args) {
User user = new User("王五", 28);
Gson gson = new Gson();
// 对象转JSON字符串
String jsonStr = gson.toJson(user);
System.out.println(jsonStr);
// 输出:{"name":"王五","age":28}
}
}
(2)JSON转Java对象(反序列化)
String jsonStr = "{\"name\":\"赵六\",\"age\":35}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);
System.out.println("姓名:" + user.getName() + ",年龄:" + user.getAge());
// 输出:姓名:赵六,年龄:35
(3)复杂对象处理(List/Map/嵌套对象)
// 处理List
List<User> userList = Arrays.asList(
new User("张三", 25),
new User("李四", 30)
);
String jsonList = gson.toJson(userList);
System.out.println(jsonList);
// 输出:[{"name":"张三","age":25},{"name":"李四","age":30}]
List<User> parsedList = gson.fromJson(jsonList, new TypeToken<List<User>>(){}.getType());
System.out.println(parsedList.get(0).getName()); // 输出:张三
3 高级特性
- 注解支持:通过
@SerializedName自定义JSON字段名,@Expose控制序列化字段等; - 格式化:
new GsonBuilder().setPrettyPrinting().create()可输出格式化JSON; - 自定义适配器:实现
JsonSerializer/JsonDeserializer处理特殊类型(如日期)。
第三方工具:Jackson(高性能首选)
Jackson是Java生态中最流行的JSON库,以其高性能、低内存占用和丰富的功能(如支持Spring、Spring Boot)成为许多框架的默认选择。
1 引入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
2 基本使用
(1)对象与JSON互转
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
class Student {
private String name;
private int age;
// 无参构造方法(Jackson要求)
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// Getter/Setter
public String getName() { return name; }
public int getAge() { return age; }
}
public class JacksonDemo {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
// 对象转JSON
Student student = new Student("钱七", 22);
String jsonStr = mapper.writeValueAsString(student);
System.out.println(jsonStr);
// 输出:{"name":"钱七","age":22}
// JSON转对象
Student parsedStudent = mapper.readValue(jsonStr, Student.class);
System.out.println(parsedStudent.getName()); // 输出:钱七
}
}
(2)处理复杂类型(List/数组/日期)
// 处理List
List<Student> studentList = Arrays.asList(
new Student("张三", 20),
new Student("李四", 21)
);
String jsonList = mapper.writeValueAsString(studentList);
System.out.println(jsonList);
// 输出:[{"name":"张三","age":20},{"name":"李四","age":21}]
List<Student> parsedList = mapper.readValue(jsonList,
mapper.getTypeFactory().constructCollectionType(List.class, Student.class));
(3)日期处理
import java.util.Date;
class Event {
private String name;
private Date date;
// 构造方法/Getter/Setter
}
// 默认日期格式为时间戳,可自定义格式
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
Event event = new Event("会议", new Date());
String jsonDate = mapper.writeValueAsString(event);
System.out.println(jsonDate);
// 输出:{"name":"会议","date":"2023-10-01 14:30:00"}
3 高级特性
- 注解支持:
@JsonProperty(字段映射)、@JsonIgnore(忽略字段)、@JsonFormat(日期格式)等; - 树模型(JsonNode):类似XML的DOM,支持灵活遍历和修改JSON;
- 流式API(JsonParser/JsonGenerator):高性能处理大文件,适合内存敏感场景。
第三方工具:Fastjson(阿里巴巴)
Fastjson是阿里巴巴开源的高性能JSON库,以“快”为核心优势,在国内Java开发中广泛使用,但需注意版本安全性问题。
1 引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version> <!-- 建议使用最新安全版本 -->
</dependency>


还没有评论,来说两句吧...