Java中的JSON怎么用:从基础到实践的全面指南
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读、易解析的特点,已成为Java开发中与前后端交互、API数据传输、配置文件管理等场景的核心工具,本文将从Java中JSON的使用基础出发,逐步讲解常用库的API、操作场景及最佳实践,帮助开发者快速JSON处理技巧。
为什么Java中需要使用JSON?
在Java应用中,JSON主要用于解决“数据结构化”与“跨语言传输”的问题。
- 前后端交互:后端Java服务将数据转为JSON,前端JavaScript可直接解析;
- API接口:RESTful API普遍使用JSON作为请求/响应格式;
- 配置管理:相比XML,JSON更简洁,适合存储动态配置(如Spring Boot的
application.json); - 数据存储:NoSQL数据库(如MongoDB)直接支持JSON格式数据。
Java中常用的JSON库
Java标准库本身不直接支持JSON,但第三方库提供了成熟的解决方案,目前主流的JSON库包括:
| 库名称 | 特点 | 适用场景 |
|---|---|---|
| Gson | Google开发,轻量级,支持复杂对象转换,注解丰富 | Android开发、常规JSON处理 |
| Jackson | 高性能,功能全面(支持流式解析、数据绑定),Spring Boot默认内置 | 企业级应用、大数据量处理 |
| Fastjson | 阿里巴巴开发,解析速度快,支持JSON与Java对象双向转换 | 国内互联网企业,追求性能场景 |
| org.json | 轻量级,API简单,适合小型项目或快速开发 | 简单JSON操作、工具类封装 |
推荐选择:
- 新项目优先用Jackson(生态成熟,与Spring等框架无缝集成);
- Android开发或需要简洁API时选Gson;
- 对性能要求极高且数据结构复杂时选Fastjson(需注意版本安全性)。
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;
// 定义Java类(POJO)
class User {
private String name;
private int age;
private String[] hobbies;
// 构造方法、getter/setter(省略)
public User(String name, int age, String[] hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + ", hobbies=" + Arrays.toString(hobbies) + "}";
}
}
public class GsonExample {
public static void main(String[] args) {
User user = new User("张三", 25, new String[]{"篮球", "编程"});
// 创建Gson实例
Gson gson = new Gson();
// Java对象转JSON字符串
String jsonStr = gson.toJson(user);
System.out.println(jsonStr);
// 输出:{"name":"张三","age":25,"hobbies":["篮球","编程"]}
}
}
JSON转Java对象(反序列化)
// JSON字符串转Java对象
User deserializedUser = gson.fromJson(jsonStr, User.class);
System.out.println(deserializedUser);
// 输出:User{name='张三', age=25, hobbies=[篮球, 编程]}
处理复杂场景(List、Map、嵌套对象)
// List转JSON
List<User> userList = Arrays.asList(
new User("李四", 30, new String[]{"足球"}),
new User("王五", 28, new String[]{"阅读", "游泳"})
);
String listJson = gson.toJson(userList);
System.out.println(listJson);
// 输出:[{"name":"李四","age":30,"hobbies":["足球"]},{"name":"王五","age":28,"hobbies":["阅读","游泳"]}]
// JSON转List
List<User> userListFromJson = gson.fromJson(listJson, new TypeToken<List<User>>(){}.getType());
System.out.println(userListFromJson.get(0).getName()); // 输出:李四
Jackson:高性能的JSON处理利器
添加依赖(Maven)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
核心API:ObjectMapper
Jackson的核心是ObjectMapper类,负责对象与JSON的转换。
(1)Java对象转JSON
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
class Product {
private String id;
private String name;
private double price;
// 构造方法、getter/setter(省略)
public Product(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
}
public class JacksonExample {
public static void main(String[] args) throws JsonProcessingException {
Product product = new Product("P001", "笔记本电脑", 5999.0);
ObjectMapper mapper = new ObjectMapper();
// 序列化为JSON字符串(默认格式化紧凑)
String jsonStr = mapper.writeValueAsString(product);
System.out.println(jsonStr);
// 输出:{"id":"P001","name":"笔记本电脑","price":5999.0}
// 格式化输出(缩进2个空格)
String formattedJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(product);
System.out.println(formattedJson);
/* 输出:
{
"id" : "P001",
"name" : "笔记本电脑",
"price" : 5999.0
}
*/
}
}
(2)JSON转Java对象
String jsonStr = "{\"id\":\"P002\",\"name\":\"手机\",\"price\":3999.0}";
Product productFromJson = mapper.readValue(jsonStr, Product.class);
System.out.println(productFromJson.getName()); // 输出:手机
(3)处理日期格式
import java.util.Date;
class Order {
private String orderId;
private Date createTime;
// 构造方法、getter/setter(省略)
public Order(String orderId, Date createTime) {
this.orderId = orderId;
this.createTime = createTime;
}
}
public class JacksonDateExample {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 设置日期格式
Order order = new Order("ORD001", new Date());
String jsonStr = mapper.writeValueAsString(order);
System.out.println(jsonStr);
// 输出:{"orderId":"ORD001","createTime":"2023-10-01 14:30:00"}
}
}
(4)注解支持
Jackson通过注解可以灵活控制JSON与对象的映射关系:
@JsonProperty:指定JSON字段名(如@JsonProperty("user_name")对应userName);@JsonIgnore:忽略字段(不参与序列化/反序列化);@JsonFormat:格式化日期/数字(如@JsonFormat(pattern = "yyyy-MM-dd"))。
Fastjson:高性能的国产JSON库
添加依赖(Maven)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version> <!-- 注意:尽量使用最新稳定版,避免已知漏洞 -->
</dependency>
基本使用
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
// Java对象转JSON
Student student = new Student("小红", 20, "女");
String jsonStr = JSON.toJSONString(student);
System.out.println(jsonStr); // 输出:{"age":20,"name":"小红","sex":"女"}
// JSON转Java对象
Student studentFromJson = JSON.parseObject(jsonStr, Student.class);
System.out.println(studentFromJson.getName()); // 输出:小红
// 处理JSON数组
String jsonArrayStr = "[{\"name\":\"小明\",\"age\":18},{\"name\":\"小刚\",\"age\":19}]";
JSONArray jsonArray = JSON.parseArray(jsonArrayStr);
List<Student> studentList = JSON.parseArray(jsonArrayStr, Student.class);
System.out.println(studentList.get(


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