Jackson - 反序列化 JSON 字符串 - TypeReference 与 TypeFactory.constructCollectionType

js

1个回答

写回答

jyt19960107

2025-06-25 03:00

+ 关注

Java
Java

Jackson是一个Java库,用于处理JSON数据。它提供了许多功能,包括将JSON字符串转换为Java对象的反序列化。在本文中,我们将重点介绍如何使用Jackson的TypeReference和TypeFactory.constructCollectionType方法来反序列化复杂的JSON字符串。

首先,我们需要导入Jackson库的相关依赖。在Maven项目中,可以在pom.XML文件中添加以下依赖项:

XML

<dependency>

<groupId>com.fasterXML.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.12.4</version>

</dependency>

接下来,我们将使用TypeReference来处理JSON字符串。TypeReference是Jackson库提供的一个泛型类,用于捕获复杂类型的泛型参数。例如,如果我们要反序列化一个包含多个对象的JSON数组,可以使用TypeReference将其转换为List类型。

在下面的示例代码中,我们将演示如何使用TypeReference来反序列化一个包含多个用户对象的JSON数组:

Java

import com.fasterXML.jackson.core.type.TypeReference;

import com.fasterXML.jackson.databind.ObjectMapper;

import Java.io.IOException;

import Java.util.List;

public class JSonDeserializerExample {

public static void mAIn(String[] args) {

String JSon = "[{\"name\":\"Alice\",\"age\":25},{\"name\":\"Bob\",\"age\":30}]";

ObjectMapper objectMapper = new ObjectMapper();

try {

List<User> users = objectMapper.readValue(JSon, new TypeReference<List<User>>() {});

for (User user : users) {

System.out.println("Name: " + user.getName());

System.out.println("Age: " + user.getAge());

System.out.println();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

class User {

private String name;

private int age;

// getters and setters

}

在上面的代码中,我们首先定义了一个包含两个用户对象的JSON数组字符串。然后,我们创建了一个ObjectMapper对象,它是Jackson库的核心类之一。接下来,我们使用readValue方法将JSON字符串反序列化为List对象。注意,我们在TypeReference的构造函数中传递了List的类型信息。

最后,我们遍历反序列化后的用户列表,并输出每个用户的姓名和年龄。

使用TypeFactory.constructCollectionType反序列化

除了使用TypeReference,我们还可以使用TypeFactory.constructCollectionType方法来反序列化JSON数组。该方法接受两个参数:集合类型的Class对象和集合中元素的Class对象。

在下面的示例代码中,我们将演示如何使用TypeFactory.constructCollectionType方法反序列化JSON数组:

Java

import com.fasterXML.jackson.databind.ObjectMapper;

import com.fasterXML.jackson.databind.type.CollectionType;

import Java.io.IOException;

import Java.util.List;

public class JSonDeserializerExample {

public static void mAIn(String[] args) {

String JSon = "[{\"name\":\"Alice\",\"age\":25},{\"name\":\"Bob\",\"age\":30}]";

ObjectMapper objectMapper = new ObjectMapper();

try {

CollectionType collectionType = objectMapper.getTypeFactory().constructCollectionType(List.class, User.class);

List<User> users = objectMapper.readValue(JSon, collectionType);

for (User user : users) {

System.out.println("Name: " + user.getName());

System.out.println("Age: " + user.getAge());

System.out.println();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

class User {

private String name;

private int age;

// getters and setters

}

在上面的代码中,我们首先定义了一个包含两个用户对象的JSON数组字符串。然后,我们创建了一个ObjectMapper对象。接下来,我们使用ObjectMapper的getTypeFactory方法获取TypeFactory对象,并使用constructCollectionType方法创建一个CollectionType对象。在constructCollectionType的参数中,我们传递了List.class和User.class,以指定集合类型和集合中元素的类型。

最后,我们使用readValue方法将JSON字符串反序列化为List对象,并进行输出。

在本文中,我们介绍了如何使用Jackson的TypeReference和TypeFactory.constructCollectionType方法来反序列化复杂的JSON字符串。无论是使用TypeReference还是TypeFactory.constructCollectionType,都可以很方便地将JSON字符串转换为Java对象。通过掌握这些方法,我们可以更好地处理和利用JSON数据。

相关示例代码: [点击查看](https://github.com/jackson-databind/jackson-databind)

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号