Java中JSON格式转换全指南:从入门到精通
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读易写、解析高效的特点,已成为前后端数据交互、API接口通信、配置文件存储等场景的主流选择,本文将详细介绍Java中JSON格式转换的核心方法,包括常用库的对比、代码示例及最佳实践,帮助开发者快速JSON处理技能。
为什么需要JSON格式转换?
Java是一门强类型、面向对象的语言,而JSON是动态键值对的数据结构,两者在数据类型、组织方式上存在天然差异:
- Java对象(POJO)需要转换为JSON字符串,才能通过网络传输或存储到文本文件;
- 接收到的JSON字符串需要解析为Java对象,才能在业务逻辑中使用。
JSON格式转换是Java开发中不可或缺的环节,Java生态中主流的JSON处理库包括Jackson、Gson、Fastjson(阿里巴巴开源)等,各有优劣,开发者可根据需求选择。
主流JSON库对比
| 特性 | Jackson | Gson | Fastjson(阿里) |
|---|---|---|---|
| 性能 | 高(底层基于流式处理) | 中等 | 高(但存在安全漏洞风险) |
| 易用性 | 注解丰富,API灵活 | API简洁,无需注解 | API极简,但“自动类型”危险 |
| 生态支持 | Spring Boot默认集成 | Google官方支持,稳定 | 国内企业常用,但维护减少 |
| 安全性 | 良好 | 良好 | 曾存在反序列化漏洞(需升级) |
推荐选择:
- 新项目优先选Jackson(生态成熟、性能高、Spring生态默认);
- 简单场景或Google生态项目可选Gson(API直观);
- 避免使用旧版Fastjson,若必须使用需升级至最新安全版本。
Jackson:JSON转换的“瑞士军刀”
Jackson是Java生态中最流行的JSON库,核心模块包括:
databind:核心JSON绑定模块,支持对象与JSON互转;core:流式JSON处理(JsonParser/JsonGenerator),高性能解析/生成;annotations:注解支持,简化映射配置。
添加依赖(Maven)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 建议使用最新稳定版 -->
</dependency>
Java对象转JSON(序列化)
基础示例:直接转换
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
// 1. 定义Java对象(POJO)
class User {
private String name;
private int age;
private String[] hobbies;
// 无参构造器(Jackson反射需要)
public User() {}
// 有参构造器
public User(String name, int age, String[] hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
// Getter/Setter(Jackson通过反射访问)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String[] getHobbies() { return hobbies; }
public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }
// 重写toString(方便打印对象)
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + ", hobbies=" + Arrays.toString(hobbies) + "}";
}
}
public class JacksonSerialization {
public static void main(String[] args) throws JsonProcessingException {
// 2. 创建ObjectMapper实例(线程安全,可复用)
ObjectMapper objectMapper = new ObjectMapper();
// 3. 创建Java对象
User user = new User("张三", 25, new String[]{"篮球", "编程"});
// 4. 转换为JSON字符串
String jsonString = objectMapper.writeValueAsString(user);
System.out.println("JSON字符串: " + jsonString);
// 输出: {"name":"张三","age":25,"hobbies":["篮球","编程"]}
// 5. 写入文件/字节流
// objectMapper.writeValue(new File("user.json"), user);
// objectMapper.writeValue(System.out, user); // 直接输出到控制台
}
}
高级配置:格式化、忽略字段、日期处理
// 配置ObjectMapper
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); // 美化输出(缩进2空格)
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); // 日期不转为时间戳
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 自定义日期格式
// 忽略null字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 使用注解控制字段
class User {
@JsonProperty("username") // 将Java字段name映射为JSON的username
private String name;
@JsonIgnore // 忽略此字段,不参与序列化
private String password;
@JsonFormat(pattern = "yyyy-MM-dd") // 日期格式化
private Date birthday;
}
JSON转Java对象(反序列化)
public class JacksonDeserialization {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = "{\"name\":\"李四\",\"age\":30,\"hobbies\":\"读书,旅行\"}";
// 直接反序列化为User对象
User user = objectMapper.readValue(jsonString, User.class);
System.out.println("Java对象: " + user);
// 输出: User{name='李四', age=30, hobbies=[读书, 旅行]}
// 反序列化为List
String jsonArrayString = "[{\"name\":\"王五\",\"age\":20},{\"name\":\"赵六\",\"age\":25}]";
List<User> userList = objectMapper.readValue(jsonArrayString,
new TypeReference<List<User>>() {}); // 需要TypeReference获取泛型类型
System.out.println("用户列表: " + userList);
}
}
流式处理(高性能场景)
Jackson的流式API(JsonParser/JsonGenerator)适合处理大JSON文件,避免全量加载到内存:
// 解析大JSON文件(逐行读取)
try (JsonParser parser = objectMapper.getFactory().createParser(new File("large.json"))) {
while (parser.nextToken() != null) {
// 逐个Token处理(如字段名、值等)
String fieldName = parser.getCurrentName();
if ("name".equals(fieldName)) {
parser.nextToken(); // 移动到值
String name = parser.getText();
System.out.println("Name: " + name);
}
}
}
Gson:Google的“简洁之选”
Gson由Google开发,以API简洁、无需额外配置著称,适合中小型项目。
添加依赖(Maven)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
基础使用示例
import com.google.gson.Gson;
class User {
private String name;
private int age;
private String[] hobbies;
// 无参构造器、Getter/Setter省略(同Jackson)
}
public class GsonDemo {
public static void main(String[] args) {
Gson gson = new Gson(); // 创建Gson实例(线程安全,可复用)
// 1. Java对象转JSON(序列化)
User user = new User("钱七", 28, new String[]{"音乐", "摄影"});
String jsonString = gson.toJson(user);
System.out.println("JSON字符串: " + jsonString);
// 输出: {"name":"钱七","age":28,"hobbies":["音乐","摄影"]}
// 2. JSON转Java对象(反序列化)
String jsonStr = "{\"name\":\"孙八\",\"age\":35,\"hobbies\":\"登山,游泳\"}";
User deserializedUser = gson.fromJson(jsonStr, User.class);
System.out.println("Java对象: " + deserializedUser);
}
}
Gson高级特性
自定义序列化/反序列化
// 自定义日期序列化器
class DateSerializer implements JsonSerializer<Date> {
@Override
public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
return new Json


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