JSON在Java中的使用指南:从基础到实践
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读性、简洁性和跨语言特性,被广泛应用于前后端数据交互、配置文件存储、API响应等场景,本文将详细介绍JSON在Java中的使用方法,包括核心库的选择、数据解析与生成、实战应用及常见问题解决。
JSON与Java:为什么需要JSON?
JSON是一种键值对(Key-Value)结构的数据格式,支持多种数据类型:对象({})、数组([])、字符串("")、数字、布尔值(true/false)和null,相比于XML,JSON更轻量(解析/生成速度更快),占用带宽更少,因此成为Java应用与前端、第三方服务交互的首选数据格式。
在Java中,我们通常需要完成两类操作:将Java对象转换为JSON字符串(序列化),以及将JSON字符串解析为Java对象(反序列化),我们将基于主流的JSON库展开讲解。
主流JSON库对比与选择
Java生态中有多种JSON处理库,各有优劣,开发者可根据需求选择:
| 库名称 | 特点 | 适用场景 |
|---|---|---|
| Gson | Google开发,轻量级,支持复杂对象映射,API简单 | 常规Java对象序列化/反序列化 |
| Jackson | 性能优秀,功能强大(支持流式解析、注解定制),Spring Boot默认集成 | 高性能场景、复杂JSON处理 |
| Fastjson | 阿里巴巴开发,解析速度快,支持Java对象与JSON双向转换 | 国内企业级应用(需注意版本安全) |
| org.json | 轻量级,API简单,但功能相对基础 | 简单JSON处理、快速开发 |
推荐选择:
- 新项目优先选Jackson(Spring Boot默认支持,生态完善);
- 若需与Google生态(如Android)结合,可选Gson;
- 简单场景或轻量级需求,可选org.json。
Gson:简单易用的JSON工具
添加依赖
Maven项目中添加Gson依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
Java对象转JSON(序列化)
通过Gson对象的toJson()方法实现:
import com.google.gson.Gson;
public class GsonSerializeDemo {
public static void main(String[] args) {
// 1. 创建Java对象
User user = new User("张三", 25, "zhangsan@example.com");
// 2. 创建Gson实例
Gson gson = new Gson();
// 3. 转换为JSON字符串
String jsonStr = gson.toJson(user);
System.out.println(jsonStr);
// 输出:{"name":"张三","age":25,"email":"zhangsan@example.com"}
}
}
class User {
private String name;
private int age;
private String email;
// 构造方法、getter/setter(省略)
}
JSON转Java对象(反序列化)
通过fromJson()方法实现,需指定目标Java对象的类型:
import com.google.gson.Gson;
public class GsonDeserializeDemo {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"李四\",\"age\":30,\"email\":\"lisi@example.com\"}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);
System.out.println("姓名:" + user.getName());
System.out.println("年龄:" + user.getAge());
System.out.println("邮箱:" + user.getEmail());
}
}
处理复杂对象(嵌套对象、集合)
Gson默认支持嵌套对象和集合(如List、Map),无需额外配置:
import com.google.gson.Gson;
import java.util.List;
import java.util.ArrayList;
public class GsonComplexDemo {
public static void main(String[] args) {
// 创建包含嵌套对象和集合的对象
User user = new User("王五", 28, "wangwu@example.com");
List<String> hobbies = new ArrayList<>();
hobbies.add("阅读");
hobbies.add("游泳");
user.setHobbies(hobbies);
Gson gson = new Gson();
String jsonStr = gson.toJson(user);
System.out.println(jsonStr);
// 输出:{"name":"王五","age":28,"email":"wangwu@example.com","hobbies":["阅读","游泳"]}
// 反序列化
User deserializedUser = gson.fromJson(jsonStr, User.class);
System.out.println(deserializedUser.getHobbies()); // 输出:[阅读, 游泳]
}
}
Jackson:功能强大的JSON工具
添加依赖
Maven依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
核心类与使用
Jackson的核心类包括ObjectMapper(用于序列化/反序列化)、JsonParser(流式解析)、JsonGenerator(流式生成),日常开发中主要使用ObjectMapper。
(1)Java对象转JSON(序列化)
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonSerializeDemo {
public static void main(String[] args) throws JsonProcessingException {
User user = new User("赵六", 35, "zhaoliu@example.com");
// 创建ObjectMapper实例
ObjectMapper objectMapper = new ObjectMapper();
// 转换为JSON字符串(默认格式化输出)
String jsonStr = objectMapper.writeValueAsString(user);
System.out.println(jsonStr);
// 输出:{"name":"赵六","age":35,"email":"zhaoliu@example.com"}
// 格式化输出(美化JSON)
String prettyJsonStr = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
System.out.println(prettyJsonStr);
/* 输出:
{
"name" : "赵六",
"age" : 35,
"email" : "zhaoliu@example.com"
}
*/
}
}
(2)JSON转Java对象(反序列化)
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonDeserializeDemo {
public static void main(String[] args) throws JsonProcessingException {
String jsonStr = "{\"name\":\"钱七\",\"age\":40,\"email\":\"qianqi@example.com\"}";
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(jsonStr, User.class);
System.out.println("姓名:" + user.getName());
System.out.println("年龄:" + user.getAge());
System.out.println("邮箱:" + user.getEmail());
}
}
注解定制JSON映射
Jackson通过注解灵活控制JSON与Java对象的映射关系:
| 注解 | 作用 |
|---|---|
@JsonProperty |
指定JSON字段名与Java属性名的映射(如@JsonProperty("user_name")) |
@JsonIgnore |
忽略某个属性(不参与序列化/反序列化) |
@JsonIgnoreProperties |
忽略JSON中存在但Java对象不存在的属性(反序列化时) |
@JsonFormat |
格式化日期/数字(如@JsonFormat(pattern="yyyy-MM-dd")) |
示例:
import com.fasterxml.jackson.annotation.*;
public class AnnotatedUser {
@JsonProperty("username")
private String name;
@JsonIgnore
private String password; // 忽略password字段
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
// 构造方法、getter/setter(省略)
}
Fastjson:高性能的国产JSON库
添加依赖
Maven依赖(注意版本安全,建议使用1.2.83+):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
基本使用
Fastjson的API非常简洁,通过JSON工具类直接操作:
(1)序列化
import com.alibaba.fastjson.JSON;
public class FastjsonSerializeDemo {
public static void main(String[] args) {
User user = new User("孙八", 45, "sunba@example.com");
// 转换为


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