Java中JSON数据的转换:从入门到实践
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读性强、解析高效而被广泛应用于前后端数据交互、配置文件存储、API接口开发等场景,本文将详细介绍Java中JSON数据的转换方法,包括常用库的介绍、核心操作步骤及实际应用示例,帮助开发者快速JSON与Java对象之间的互转技巧。
为什么需要JSON数据转换?
Java是静态类型语言,而JSON是动态键值对结构的数据格式,当前后端交互时,后端需将Java对象(如实体类、List、Map等)转换为JSON字符串返回给前端;前端传递数据时,又需将JSON字符串解析为Java对象供后端处理,JSON与Java对象的转换是Java开发中不可或缺的基础技能。
常用JSON处理库对比
Java生态中有多款优秀的JSON处理库,各有特点,开发者可根据需求选择:
| 库名 | 特点 | 适用场景 | 
|---|---|---|
| Jackson | 高性能、功能全面,支持注解定制,Spring Boot默认集成 | 企业级应用、复杂对象转换 | 
| Gson | Google开发,API简洁,对复杂类型(如泛型)支持友好 | 中小型项目、Android开发 | 
| Fastjson | 阿里巴巴开发,解析速度极快,但早期版本存在安全漏洞(新版本已修复) | 对性能要求极高的场景 | 
| org.json | 轻量级,API简单,但功能相对基础 | 简单JSON处理、小型项目 | 
推荐:若无特殊需求,优先选择Jackson(Spring Boot默认)或Gson,兼顾性能与易用性。
Jackson实现JSON与Java对象互转
Jackson是当前Java生态中最主流的JSON库,通过com.fasterxml.jackson.core包下的核心类实现转换。
添加依赖
Maven项目需在pom.xml中添加Jackson核心依赖(以Jackson为例):
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 建议使用最新稳定版 -->
</dependency>
Java对象转JSON字符串(序列化)
使用ObjectMapper的writeValueAsString()方法,将Java对象转换为JSON字符串。
示例:实体类序列化
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
// 1. 定义Java实体类
class User {
    private String name;
    private int age;
    private String email;
    // 无参构造器(Jackson序列化/反序列化需要)
    public User() {}
    // 有参构造器
    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    // 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 getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + ", email='" + email + "'}";
    }
}
public class Main {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("张三", 25, "zhangsan@example.com");
        try {
            // Java对象转JSON字符串
            String jsonStr = mapper.writeValueAsString(user);
            System.out.println("JSON字符串: " + jsonStr);
            // 输出: {"name":"张三","age":25,"email":"zhangsan@example.com"}
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}
JSON字符串转Java对象(反序列化)
使用ObjectMapper的readValue()方法,将JSON字符串转换为Java对象。
示例:JSON字符串反序列化为User对象
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        String jsonStr = "{\"name\":\"李四\",\"age\":30,\"email\":\"lisi@example.com\"}";
        try {
            // JSON字符串转Java对象
            User user = mapper.readValue(jsonStr, User.class);
            System.out.println("Java对象: " + user);
            // 输出: User{name='李四', age=30, email='lisi@example.com'}
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}
处理复杂类型:List、Map等
Jackson支持复杂集合类型的转换,只需在readValue()中指定目标类型(如List<User>.class需通过TypeReference解决泛型擦除问题)。
示例:JSON数组转List
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        String jsonArrayStr = "[" +
                "{\"name\":\"张三\",\"age\":25,\"email\":\"zhangsan@example.com\"}," +
                "{\"name\":\"李四\",\"age\":30,\"email\":\"lisi@example.com\"}" +
                "]";
        try {
            // 使用TypeReference解决泛型擦除问题
            List<User> userList = mapper.readValue(jsonArrayStr, new TypeReference<List<User>>() {});
            userList.forEach(System.out::println);
            // 输出:
            // User{name='张三', age=25, email='zhangsan@example.com'}
            // User{name='李四', age=30, email='lisi@example.com'}
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}
常用注解定制转换行为
Jackson提供了丰富的注解,可灵活控制JSON与Java对象的映射规则:
| 注解 | 作用 | 示例 | 
|---|---|---|
@JsonProperty | 
修改JSON字段名与Java属性的映射 | @JsonProperty("userName") private String name; | 
@JsonIgnore | 
忽略某个属性(不参与序列化/反序列化) | @JsonIgnore private String password; | 
@JsonFormat | 
格式化日期/数字类型 | @JsonFormat(pattern = "yyyy-MM-dd") private Date birthDate; | 
@JsonCreator | 
自定义构造方法(用于反序列化时复杂对象初始化) | 见下方示例 | 
示例:使用注解定制
import com.fasterxml.jackson.annotation.*;
class User {
    @JsonProperty("userName") // JSON字段名映射为userName
    private String name;
    @JsonIgnore // 忽略password字段
    private String password;
    @JsonFormat(pattern = "yyyy-MM-dd") // 日期格式化
    private Date registerDate;
    @JsonCreator // 自定义构造方法(适用于无参构造器不可用场景)
    public User(@JsonProperty("name") String name) {
        this.name = name;
    }
    // Getter/Setter省略
}
// 测试序列化
String jsonStr = mapper.writeValueAsString(new User("王五", "123456", new Date()));
// 输出: {"userName":"王五","registerDate":"2023-10-01"}(password被忽略)
Gson实现JSON转换(简介)
若项目中使用Gson,其API与Jackson类似,但更简洁,以下是核心示例:
添加依赖
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>
对象转JSON字符串
import com.google.gson.Gson;
class User { /* 同Jackson示例中的User类 */ }
public class Main {
    public static void main(String[] args) {
        Gson gson = new Gson();
        User user = new User("赵六", 28, "zhaoliu@example.com");
        String jsonStr = gson.toJson(user);
        System.out.println("JSON字符串: " + jsonStr);
        // 输出: {"name":"赵六","age":28,"email":"zhaoliu@example.com"}
    }
}
JSON字符串转对象
import com.google.gson.Gson;
public class Main {
    public static void main(String[] args) {
        Gson gson = new Gson();
        String jsonStr = "{\"name\":\"钱


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