Java中JSON的全面运用指南
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁、易读、易解析的特性,已成为前后端数据交互、配置文件存储、API响应等场景的主流选择,Java作为企业级开发的核心语言,与JSON的结合使用几乎无处不在,本文将系统介绍Java中JSON的运用,包括核心概念、常用库的使用、实战场景及最佳实践,帮助开发者快速Java与JSON的交互技巧。
Java中处理JSON的核心概念
在代码实践前,需先理解JSON与Java数据类型的对应关系,这是正确处理JSON数据的基础:
| JSON类型 | Java类型 | 说明 |
|---|---|---|
| 对象() | Map / 自定义JavaBean |
键值对集合,键为String,值为任意JSON类型 |
数组([]) |
List / 数组 |
有序集合,元素为任意JSON类型 |
| 字符串() | String |
需用双引号包围 |
| 数字 | Integer/Double/BigDecimal |
根据精度选择,如整数用Integer,小数用Double |
布尔值(true/false) |
Boolean |
直接对应true/false |
空值(null) |
null |
对应Java中的null |
Java中常用JSON库对比与选择
Java生态中提供了多个JSON处理库,各有优劣,开发者可根据需求选择:
| 库名 | 维度 | 特点 |
|---|---|---|
| Gson | Google开发 | 轻量级,支持复杂对象序列化/反序列化,注解灵活(如@SerializedName) |
| Jackson | FasterXML | 性能优异,功能强大(支持流式解析、数据绑定),Spring Boot默认集成 |
| Fastjson | 阿里巴巴 | 解析速度快,API简洁,但早期版本存在安全漏洞(新版本已修复) |
| org.json | 库 | 极简轻量,适合简单JSON操作,但功能相对有限 |
推荐选择:
- 新项目优先选Jackson(生态完善、性能好,与Spring框架无缝集成);
- 需要快速处理简单JSON时用org.json;
- 对注解灵活性要求高时选Gson。
核心操作:序列化与反序列化
JSON处理的本质是序列化(Java对象→JSON字符串)和反序列化(JSON字符串→Java对象),下面以最常用的Jackson和Gson为例演示。
(一)Jackson:功能强大的全能选手
添加依赖(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;
// 定义JavaBean(POJO)
class User {
private String name;
private int age;
private String[] hobbies;
// 必须提供无参构造器(反序列化时需要)
public User() {}
// getter/setter(或使用Lombok简化)
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; }
}
public class JacksonDemo {
public static void main(String[] args) throws JsonProcessingException {
User user = new User();
user.setName("张三");
user.setAge(25);
user.setHobbies(new String[]{"编程", "阅读"});
// 创建ObjectMapper(线程安全,可复用)
ObjectMapper mapper = new ObjectMapper();
// 序列化为JSON字符串(默认格式化输出)
String jsonStr = mapper.writeValueAsString(user);
System.out.println(jsonStr);
// 输出:{"name":"张三","age":25,"hobbies":["编程","阅读"]}
}
}
反序列化:JSON字符串→Java对象
// 继续使用上面的User类和ObjectMapper
String jsonStr = "{\"name\":\"李四\",\"age\":30,\"hobbies\":\"篮球,音乐\"}";
// 反序列化为User对象
User user = mapper.readValue(jsonStr, User.class);
System.out.println("姓名:" + user.getName() + ",爱好:" + String.join(",", user.getHobbies()));
// 输出:姓名:李四,爱好:篮球,音乐
处理复杂场景:List/Map与JSON互转
// JSON字符串转List<User>
String jsonArrayStr = "[{\"name\":\"王五\",\"age\":20},{\"name\":\"赵六\",\"age\":22}]";
List<User> userList = mapper.readValue(jsonArrayStr, new TypeReference<List<User>>() {});
userList.forEach(u -> System.out.println(u.getName()));
// JSON字符串转Map
String jsonMapStr = "{\"key1\":\"value1\",\"key2\":123}";
Map<String, Object> map = mapper.readValue(jsonMapStr, new TypeReference<Map<String, Object>>() {});
System.out.println(map); // 输出:{key1=value1, key2=123}
(二)Gson:灵活注解的轻量级选择
添加依赖(Maven)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
序列化与反序列化
import com.google.gson.Gson;
// 定义JavaBean(无需无参构造器,但需getter/setter)
class Product {
private String productName;
private double price;
// 使用注解映射JSON中的键名(如JSON中是"name",Java字段是"productName")
@SerializedName("name")
public String getProductName() { return productName; }
public void setProductName(String productName) { this.productName = productName; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
}
public class GsonDemo {
public static void main(String[] args) {
Gson gson = new Gson();
Product product = new Product();
product.setProductName("Java编程思想");
product.setPrice(108.0);
// 序列化
String jsonStr = gson.toJson(product);
System.out.println(jsonStr);
// 输出:{"name":"Java编程思想","price":108.0}
// 反序列化
Product product2 = gson.fromJson(jsonStr, Product.class);
System.out.println(product2.getProductName() + ",价格:" + product2.getPrice());
// 输出:Java编程思想,价格:108.0
}
}
实战场景:从HTTP响应中解析JSON
实际开发中,最常见的需求是从HTTP接口获取JSON数据并解析为Java对象,以Spring Boot(默认集成Jackson)为例,演示如何调用REST API并解析JSON响应。
添加Spring Boot Web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
定义HTTP客户端工具类(使用RestTemplate)
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
// 假设API返回JSON:[{"id":1,"title":"Spring Boot实战"},{"id":2,"title":"Java面试宝典"}]
class Book {
private int id;
private String title;
// getter/setter
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
}
public class HttpJsonParser {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
String apiUrl = "https://api.example.com/books"; // 替换为真实API地址
// 发送GET请求,获取JSON字符串
String jsonStr = restTemplate.getForObject(apiUrl, String.class);
System.out.println("原始JSON:" + jsonStr);
// 使用Jackson解析为List<Book>
ObjectMapper mapper = new ObjectMapper();
try {
List<Book> bookList = mapper.readValue(jsonStr, new Type


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