章
目
录
在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,因此在这种情况下使用它是合理的。