返回

Jackson 反序列化对象数组:从入门到精通

java

使用 Jackson 反序列化对象数组:深入浅出指南

简介

Jackson 是 Java 中流行且功能强大的 JSON 库,它允许你将 JSON 数据映射到 Java 对象和反之亦然。在许多情况下,你可能需要反序列化 JSON 数组,其中包含多个同类型对象。在本文中,我们将深入探讨如何使用 Jackson 实现此目标。

问题

要反序列化单个对象,你可以使用 objectMapper.readValue(json, MyClass.class),其中 json 是 JSON 字符串,MyClass 是要映射到的 Java 类。但是,对于数组,该方法不起作用。

解决方案:TypeReference

Jackson 提供了一个名为 TypeReference 的类,它允许你指定要反序列化的集合或数组的类型。以下是使用 TypeReference 反序列化对象数组的步骤:

  1. 创建 TypeReference: 创建一个匿名内部类,从 TypeReference<Collection<MyClass>> 扩展。
  2. 反序列化: 使用 objectMapper.readValue(json, typeReference) 方法反序列化 JSON 字符串,其中 typeReference 是你在第一步中创建的 TypeReference

示例代码

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.List;

public class MyClass {
    private String id;
    private String stuff;
    // 省略 getters 和 setters
}

public class JacksonArrayDeserializationExample {

    public static void main(String[] args) throws Exception {
        String json = "[{\"id\": \"junk\", \"stuff\": \"things\"}, {\"id\": \"spam\", \"stuff\": \"eggs\"}]";

        ObjectMapper objectMapper = new ObjectMapper();

        // 创建 TypeReference
        TypeReference<List<MyClass>> typeReference = new TypeReference<List<MyClass>>() {};

        // 反序列化 JSON
        List<MyClass> entries = objectMapper.readValue(json, typeReference);

        // 打印反序列化的对象
        for (MyClass entry : entries) {
            System.out.println(entry.getId() + " - " + entry.getStuff());
        }
    }
}

输出:

junk - things
spam - eggs

提示

  • TypeReference 是一种泛型类,因此你可以指定任何类型的集合或数组。
  • 如果你使用 Jackson 2.x,可以使用 objectMapper.readValue(json, MyClass[].class) 来反序列化对象数组。

常见问题解答

  1. 什么是 TypeReference?

    • TypeReference 是一个类,允许你指定要反序列化的集合或数组的类型。
  2. 如何创建 TypeReference?

    • 创建一个匿名内部类,从 TypeReference<Collection<YourClass>> 扩展。
  3. 如何使用 TypeReference 反序列化数组?

    • 使用 objectMapper.readValue(json, typeReference) 方法,其中 typeReference 是你创建的 TypeReference
  4. 是否可以使用 Jackson 2.x 反序列化数组?

    • 是的,你可以使用 objectMapper.readValue(json, MyClass[].class)
  5. 我是否可以使用 TypeReference 反序列化其他类型的集合?

    • 是的,TypeReference 可用于反序列化任何类型的集合或数组。