在Java中处理JSON数据时,通常需要将JSON数组转换为Java List/ArrayList,以更高效地处理数据。本Java文章探讨了如何使用4个流行的Java库来实现这一目标:

  • FastJson
  • Gson
  • Jackson
  • Org.json

准备

本文从项目的/resources目录中读取data.json文件,其中包含JSON数组。文件内容如下:

[ {"id":1,"name":"Alex","age":41}, {"id":2,"name":"Brian","age":42}, {"id":3,"name":"Charles","age":43} ] 

我们使用以下代码将文件内容读取为Java字符串:

URL fileUrl = JsonArrayToList.class.getClassLoader().getResource("data.json"); Path filePath = Paths.get(fileUrl.toURI()); String jsonArray = Files.readString(filePath); 

我们将读取JSON内容转换为Person对象的List。

@Data @NoArgsConstructor @AllArgsConstructor class Person { long id; String name; int age; } 

1.使用FastJson

FastJson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean

1.1 Maven

<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> 

1.2. 将JSON数组转换为List

List<Person> readPersonListFromJsonArray(String jsonArray) { List<Person> personList = JSON.parseArray(jsonArray, Person.class); return personList; }

2.使用Jackson

Jackson是一个用于处理JSON和XML数据的流行Java库。它在Spring框架中自动包含,因此这里使用的技术也可以在Spring应用程序中使用。

要使用Jackson将JSON数组转换为Java列表,请按照以下步骤操作:

2.1. Maven

如果项目运行时没有最新版本的Jackson库,请添加它。

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> 

2.2. 将JSON数组转换为List

当使用Jackson解析JSON数据为Java对象或列表时,我们应该在处理泛型类型(如List<T>或Map<K, V>)时知道目标类型。TypeReference类提供了在运行时将类型信息传递给Jackson以将JSON数据反序列化为泛型类型所需的信息。

List<Person> readPersonListFromJsonArray(String jsonArray) throws JsonProcessingException { //如果在Spring / Spring Boot项目中可以使用@Autowired注入 ObjectMapper objectMapper = new ObjectMapper(); TypeReference<List<Person>> jacksonTypeReference = new TypeReference<>() {}; List<Person> personList = objectMapper.readValue(jsonArray, jacksonTypeReference); return personList; } 

3.使用Gson

Gson由Google开发,也是一个广泛使用的用于处理JSON数据的Java库。Gson提供了一个简单而方便的API,用于将Java对象序列化为JSON并将JSON反序列化为Java对象。

要使用Gson将JSON数组转换为Java列表,请按照以下步骤操作:

3.1. Maven

如果项目运行时没有最新版本的Gson库,请添加它。

<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency> 

3.2. 将JSON数组转换为List

就像Jackson使用TypeReference一样,Gson使用TypeToken来帮助将JSON数据反序列化为复杂的泛型类型。

在Java中,由于类型擦除,集合的泛型类型信息(如List<T>)在运行时不可用。因此,当处理泛型类型时,Gson不知道我们要反序列化到的确切类型。TypeToken类保留了这些信息,并充当了类型擦除限制的解决方法。

List<Person> readPersonListFromJsonArray(String jsonArray) { //如果在Spring / Spring Boot项目中可以使用@Autowired注入 Gson gson = new Gson(); Type listType = new TypeToken<List<Person>>() {}.getType(); List<Person> personList = gson.fromJson(jsonArray, listType); return personList; } 

4.使用Org.json

Org.json或JSON-Java是一个简单轻量的基于Java的库,我们可以使用它来进行JSON和XML、HTTP头、Cookies和CDL之间的编码和解码。它完全符合JSON规范(RFC-4627)。

要使用Org.json将JSON数组转换为Java列表,请按照以下步骤操作:

4.1. Maven

如果项目运行时没有最新版本的org.json库,请添加它。

<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20230618</version> </dependency> 

4.2. 将JSON数组转换为List

以下代码解析包含个人数据的JSON数组,并使用JSONArray和JSONObject类将其转换为Java Person对象的列表。

  • JSONArray表示JSON中的人员对象数组。
  • JSONObject表示JSON中的个人对象。
List<Person> readPersonListFromJsonArray(String json) { JSONArray jsonArray = new JSONArray(json); List<Person> personList = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonPerson = jsonArray.getJSONObject(i); long id = jsonPerson.getLong("id"); String name = jsonPerson.getString("name"); int age = jsonPerson.getInt("age"); Person person = new Person(id, name, age); personList.add(person); } return personList; } 

5.结论

在本文中,我们探讨了如何使用FastJson、Gson、Jackson和Org.json库将JSON数组转换为Java列表。每个库都有其优势,适用于不同的场景。Gson提供了一个简单易用的API,Jackson提供了高性能和灵活性,而Org.json则是一个更轻量级的选择。

我们应该选择最适合项目需求并充分利用其功能的库。例如,在Spring应用程序中,默认包含Jackson,因此在这种情况下使用它是合理的。