JSON在Java中的使用:从基础到实践
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读、易解析的特性,已成为前后端数据交互、配置文件存储、API响应等场景的标配,本文将从JSON的基础概念出发,详细介绍在Java中如何使用JSON,包括常用库的引入、对象与JSON的相互转换、实战场景及最佳实践。
JSON与Java:为什么需要JSON?
JSON是一种基于文本的数据格式,以键值对(Key-Value)的形式组织数据,结构清晰(类似Java中的Map和对象),支持多种数据类型(字符串、数字、布尔值、数组、嵌套对象等),相比XML,JSON更简洁,解析效率更高,特别适合网络传输(如HTTP请求/响应)和配置管理。
在Java中,我们经常需要将Java对象转换为JSON字符串(序列化),以便通过网络传输或存储;也需要将JSON字符串解析为Java对象(反序列化),以便在业务逻辑中使用,前端提交的表单数据可能是JSON格式,后端需要将其转换为Java对象进行处理;后端查询数据库的结果需要转换为JSON字符串返回给前端。
Java中处理JSON的常用库
Java标准库中并未直接提供JSON解析的工具,因此我们需要借助第三方库,目前主流的JSON库包括:
Gson(Google)
Google开发的JSON库,功能全面,支持复杂对象转换、泛型、自定义序列化/反序列化等,文档完善,社区活跃。
Jackson
高性能的JSON库,广泛用于Spring框架中(Spring Boot默认集成),支持流式解析(适合处理大JSON文件)、注解配置等,性能优异。
org.json
轻量级JSON库,API简单易用,适合处理简单的JSON数据,但功能相对基础。
Fastjson(阿里巴巴)
国内使用广泛的JSON库,解析速度快,支持多种数据类型,但需注意版本安全性(历史版本存在漏洞,建议使用最新版)。
本文将以Gson和Jackson为例(两者最具代表性),介绍JSON在Java中的具体使用。
Gson:简单易用的JSON工具
引入Gson依赖
在Maven项目中,添加以下依赖:
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>
Java对象转JSON(序列化)
假设有一个User类:
public class User {
    private String name;
    private int age;
    private String email;
    // 无参构造器(Gson反序列化时需要)
    public User() {}
    // 全参构造器
    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    // Getter和Setter(Gson通过反射访问属性)
    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; }
    // 重写toString方法(方便打印)
    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + ", email='" + email + "'}";
    }
}
使用Gson将User对象转换为JSON字符串:
import com.google.gson.Gson;
public class GsonExample {
    public static void main(String[] args) {
        User user = new User("张三", 25, "zhangsan@example.com");
        Gson gson = new Gson();
        // 序列化:对象 -> JSON字符串
        String jsonStr = gson.toJson(user);
        System.out.println(jsonStr); 
        // 输出:{"name":"张三","age":25,"email":"zhangsan@example.com"}
    }
}
JSON转Java对象(反序列化)
将JSON字符串解析为User对象:
import com.google.gson.Gson;
public class GsonExample {
    public static void main(String[] args) {
        String jsonStr = "{\"name\":\"李四\",\"age\":30,\"email\":\"lisi@example.com\"}";
        Gson gson = new Gson();
        // 反序列化:JSON字符串 -> 对象
        User user = gson.fromJson(jsonStr, User.class);
        System.out.println(user); 
        // 输出:User{name='李四', age=30, email='lisi@example.com'}
    }
}
处理复杂JSON(嵌套对象、数组)
假设有一个Order类,包含User对象和商品列表:
import java.util.List;
public class Order {
    private String orderId;
    private User user;
    private List<String> items;
    // 构造器、Getter、Setter、toString省略...
}
JSON示例:
{
    "orderId": "ORD001",
    "user": {"name":"王五","age":28,"email":"wangwu@example.com"},
    "items":["商品1","商品2","商品3"]
}
转换代码:
import com.google.gson.Gson;
import java.util.Arrays;
public class GsonComplexExample {
    public static void main(String[] args) {
        String jsonStr = "{\"orderId\":\"ORD001\",\"user\":{\"name\":\"王五\",\"age\":28,\"email\":\"wangwu@example.com\"},\"items\":[\"商品1\",\"商品2\",\"商品3\"]}";
        Gson gson = new Gson();
        Order order = gson.fromJson(jsonStr, Order.class);
        System.out.println(order.getOrderId()); // 输出:ORD001
        System.out.println(order.getUser().getName()); // 输出:王五
        System.out.println(order.getItems()); // 输出:[商品1, 商品2, 商品3]
    }
}
Gson注解
Gson支持通过注解自定义序列化/反序列化行为:
@Expose:控制哪些字段参与序列化(需配置GsonBuilder)。@SerializedName:修改JSON中的字段名(如Java字段为userName,JSON中为name)。@Since:指定版本号,控制字段的版本兼容性。
示例:
public class User {
    @Expose(serialize = false) // 不参与序列化
    private String password;
    @SerializedName("username") // JSON中字段名为username
    private String name;
    // 其他代码省略...
}
Jackson:高性能的JSON工具
引入Jackson依赖
Maven依赖:
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>
Java对象转JSON(序列化)
同样以User类为例,使用Jackson进行序列化:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
    public static void main(String[] args) throws Exception {
        User user = new User("赵六", 35, "zhaoliu@example.com");
        ObjectMapper objectMapper = new ObjectMapper();
        // 序列化:对象 -> JSON字符串(默认格式化输出)
        String jsonStr = objectMapper.writeValueAsString(user);
        System.out.println(jsonStr); 
        // 输出:{"name":"赵六","age":35,"email":"zhaoliu@example.com"}
        // 格式化输出(缩进2个空格)
        String formattedJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
        System.out.println(formattedJson);
        /* 输出:
        {
          "name" : "赵六",
          "age" : 35,
          "email" : "zhaoliu@example.com"
        }
        */
    }
}
JSON转Java对象(反序列化)
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
    public static void main(String[] args) throws Exception {
        String jsonStr = "{\"name\":\"钱七\",\"age\":40,\"email\":\"qianqi@example.com\"}";
        ObjectMapper objectMapper = new ObjectMapper();
        // 反序列化:JSON字符串 -> 对象
        User user = objectMapper.readValue(jsonStr, User.class);
        System.out.println(user); 
        // 输出:User{name='钱七', age=40, email='qianqi@example.com'}
    }
}
处理复杂JSON(嵌套对象、集合)
与Gson类似,Jackson也可以处理Order类的复杂JSON,代码逻辑基本一致:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
public class JacksonComplexExample {
    public static void main(String[] args) throws Exception {
        String jsonStr = "{\"orderId\":\"ORD002\",\"user\":{\"name\":\"孙八\",\"age\":32


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