准备工作:添加依赖
你需要在你的项目中添加相应库的依赖。

使用 Jackson (推荐)
Jackson 是目前 Java 社区最流行的 JSON 处理库,如果你使用 Maven,在 pom.xml 中添加以下依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 建议使用最新版本 -->
</dependency>
使用 Gson
Google 的 Gson 库也非常流行且易于使用,如果你使用 Maven,在 pom.xml 中添加以下依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 建议使用最新版本 -->
</dependency>
Java 数组转 JSON 数组
假设我们有一个简单的 Java 数组。
示例 Java 数组
String[] javaArray = {"Apple", "Banana", "Cherry"};
使用 Jackson 转换
Jackson 提供了一个 ObjectMapper 类,它是所有操作的核心。

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
public class ArrayToJsonWithJackson {
public static void main(String[] args) {
String[] javaArray = {"Apple", "Banana", "Cherry"};
// 1. 创建 ObjectMapper 实例
ObjectMapper objectMapper = new ObjectMapper();
try {
// 2. 直接调用 writeValueAsString 方法
// 它会自动将数组转换为 JSON 数组格式的字符串
String jsonString = objectMapper.writeValueAsString(javaArray);
System.out.println("转换后的 JSON 字符串:");
System.out.println(jsonString);
// 输出: ["Apple","Banana","Cherry"]
// 3. 如果你需要得到一个 JSONArray 对象(来自 org.json 库)
// 你可以先转为字符串,再解析
// 注意:Jackson 自身没有 JSONArray 类,这个例子展示了与 org.json 库的互操作
org.json.JSONArray jsonArray = new org.json.JSONArray(jsonString);
System.out.println("\n作为 org.json.JSONArray 的对象:");
System.out.println(jsonArray);
// 输出: ["Apple","Banana","Cherry"]
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
关键点:
ObjectMapper是 Jackson 的核心。objectMapper.writeValueAsString(对象)是最直接的方法,它将任何 Java 对象(包括数组、集合、POJO)序列化为 JSON 格式的字符串。
使用 Gson 转换
Gson 的使用同样非常简单。
import com.google.gson.Gson;
public class ArrayToJsonWithGson {
public static void main(String[] args) {
String[] javaArray = {"Apple", "Banana", "Cherry"};
// 1. 创建 Gson 实例
Gson gson = new Gson();
// 2. 调用 toJson 方法
String jsonString = gson.toJson(javaArray);
System.out.println("转换后的 JSON 字符串:");
System.out.println(jsonString);
// 输出: ["Apple","Banana","Cherry"]
// 3. 如果你需要得到一个 com.google.gson.JsonArray 对象
com.google.gson.JsonArray jsonArray = gson.toJsonTree(javaArray).getAsJsonArray();
System.out.println("\n作为 com.google.gson.JsonArray 的对象:");
System.out.println(jsonArray);
// 输出: ["Apple","Banana","Cherry"]
}
}
关键点:
Gson是 Gson 的核心类。gson.toJson(对象)同样是核心方法,用于序列化。gson.toJsonTree(object).getAsJsonArray()可以直接得到JsonArray对象。
Java 对象数组(POJO数组)转 JSON 数组
这是更常见、更有用的场景,我们先将一个 Java 对象数组(或 List)转换为 JSON 数组,数组中的每个元素都是一个 JSON 对象。
定义一个 Java 对象 (POJO)
// Product.java
public class Product {
private int id;
private String name;
private double price;
// 无参构造函数 (Gson 需要)
public Product() {
}
// 全参构造函数
public Product(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
// Getter 和 Setter (Jackson 和 Gson 都需要)
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
// (可选) 重写 toString 方法,方便打印查看
@Override
public String toString() {
return "Product{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
准备 Java 对象数组或 List
// 使用数组
Product[] productArray = {
new Product(1, "Laptop", 1200.50),
new Product(2, "Mouse", 25.99),
new Product(3, "Keyboard", 75.00)
};
// 或者使用 List (更推荐)
List<Product> productList = Arrays.asList(
new Product(1, "Laptop", 1200.50),
new Product(2, "Mouse", 25.99),
new Product(3, "Keyboard", 75.00)
);
使用 Jackson 转换 POJO 数组/List
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;
public class PojoArrayToJsonWithJackson {
public static void main(String[] args) {
List<Product> productList = Arrays.asList(
new Product(1, "Laptop", 1200.50),
new Product(2, "Mouse", 25.99),
new Product(3, "Keyboard", 75.00)
);
ObjectMapper objectMapper = new ObjectMapper();
try {
// 将 List 转换为 JSON 数组字符串
String jsonString = objectMapper.writeValueAsString(productList);
System.out.println("转换后的 JSON 字符串:");
System.out.println(jsonString);
/*
输出:
[
{"id":1,"name":"Laptop","price":1200.5},
{"id":2,"name":"Mouse","price":25.99},
{"id":3,"name":"Keyboard","price":75.0}
]
*/
// 同样,直接对 Product[] 数组操作效果完全一样
Product[] productArray = productList.toArray(new Product[0]);
String jsonStringFromArray = objectMapper.writeValueAsString(productArray);
System.out.println("\n从数组转换的 JSON 字符串:");
System.out.println(jsonStringFromArray);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
使用 Gson 转换 POJO 数组/List
import com.google.gson.Gson;
import java.util.Arrays;
import java.util.List;
public class PojoArrayToJsonWithGson {
public static void main(String[] args) {
List<Product> productList = Arrays.asList(
new Product(1, "Laptop", 1200.50),
new Product(2, "Mouse", 25.99),
new Product(3, "Keyboard", 75.00)
);
Gson gson = new Gson();
// 将 List 转换为 JSON 数组字符串
String jsonString = gson.toJson(productList);
System.out.println("转换后的 JSON 字符串:");
System.out.println(jsonString);
/*
输出:
[{"id":1,"name":"Laptop","price":1200.5},{"id":2,"name":"Mouse","price":25.99},{"id":3,"name":"Keyboard","price":75.0}]
*/
// 同样,直接对 Product[] 数组操作效果完全一样
Product[] productArray = productList.toArray(new Product[0]);
String jsonStringFromArray = gson.toJson(productArray);
System.out.println("\n从数组转换的 JSON 字符串:");
System.out.println(jsonStringFromArray);
}
}
进阶:自定义 JSON 输出
有时你需要控制 JSON 的格式,比如忽略某些字段、重命名字段、格式化日期等,Jackson 和 Gson 都支持通过注解来实现。
使用 Jackson 注解
修改 Product 类:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Product {
private int id;
private String name;
@JsonIgnore // 忽略这个字段,它不会出现在 JSON 中
private String internalSku;
@JsonProperty("product_price") // 重命名 JSON 中的 key
private double price;
// ... 构造函数, Getters, Setters
}
转换结果会变成:
[
{"id":1,"name":"Laptop","product_price":1200.5},
...
]
使用 Gson 注解
修改 Product 类:
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Product {
private int id;
private String name;
@Expose(deserialize = false) // 在序列化(转JSON)时包含,反序列化(JSON转Java)时忽略
private String internalSku;
@SerializedName("product_price") // 重命名 JSON 中的 key
private double price;
// ... 构造函数, Getters, Setters
}
总结与对比
| 特性 | Jackson | Gson |
|---|---|---|
| 流行度 | 非常高,Spring 框架默认集成 | 非常高,Google 出品 |
| 性能 | 通常更快,功能强大 | 性能也很好,稳定 |
| 易用性 | API 丰富,但概念稍多(如 ObjectMapper) |
非常简单直观,开箱即用 |
| 灵活性 | 极高,支持流式 API、树模型、数据绑定等多种方式 | 灵活性也很高,但 Jackson 的功能范围更广 |
| 依赖 | jackson-databind |
gson |
| 核心方法 | objectMapper.writeValueAsString(obj) |
gson.toJson(obj) |
| JSON 数组对象 | 需要与其他库(如 org.json)配合,或使用树模型 |
gson.toJsonTree(obj).getAsJsonArray() |
如何选择?
- 新项目,尤其是与 Spring 生态结合的项目:首选 Jackson,它是事实上的标准,集成度高,性能和功能都无懈可击。
- 需要快速实现,或项目已经广泛使用 Gson:使用 Gson 非常方便,代码量少。
- 需要高性能处理大量数据:Jackson 的流式 API (
JsonParser/JsonGenerator) 是更好的选择。
对于绝大多数应用场景,Jackson 是一个更全面、更强大的选择。
