杰瑞科技汇

Java对象如何转JSON数组?

准备工作:添加依赖

你需要在你的项目中添加相应库的依赖。

Java对象如何转JSON数组?-图1
(图片来源网络,侵删)

使用 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 类,它是所有操作的核心。

Java对象如何转JSON数组?-图2
(图片来源网络,侵删)
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 是一个更全面、更强大的选择。

分享:
扫描分享到社交APP
上一篇
下一篇