Java中将JSON数组转换为List:FastJson、Gson、Jackson和Org.json

培训教学 潘老师 2个月前 (09-26) 175 ℃ (0) 扫码查看

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


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9271.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】