JSON(JavaScript对象表示)是一组键-值对,可以被应用程序轻松解析和生成。它是JavaScript编程语言标准ECMA-262的一个子集。在大多数应用程序中都需要对JSON进行解析,比如restful API或需要数据序列化的应用程序。
在Java生态系统中,处理JSON数据的两个最流行的库是Jackson和Gson。两者被广泛使用,并提供独特的优势。本文使用边界案例示例来探索这两个库在不同参数上的特性。
Jackson和Gson简要概述
Jackson
Jackson由FasterXML开发,被用于企业应用程序和诸如Spring Boot之类的框架。它提供对JSON数据的解析、序列化和反序列化。以下特性使该库在开发人员中广受欢迎:
- Jackson是Spring Boot中默认的JSON处理库,在大多数情况下消除了手动配置的需要。
- 它通过TypeReference或JavaType将JSON反序列化为通用类型。
- 它提供不同的注解来自定义序列化和反序列化行为。例如,
@JsonProperty(name)
使得传入键和实际Java POJO字段之间的映射无缝。 - 它为双向数据绑定(JSON到POJO以及反向)提供了广泛且强大的支持,流式API(API将JSON读取为POJO),以及树模型解析(JSON对象的内存映射)。
- Jackson库通过最小化内存开销和优化序列化/反序列化(从JSON到POJO和反向)实现了高性能。
- Jackson支持其他模块,如XML、YAML处理和Kotlin、scala特定的增强功能。
- 诸如
@JsonTypeInfo
和@JsonSubTypes
之类的注解处理多态类型。 - 由于具有向后和向前兼容性,它可以处理JSON数据中缺失或额外的字段。
- Jackson支持不可变对象和具有构造函数的类,包括使用构建器模式的类。
ObjectMapper
类是线程安全的,因此可以在多线程应用程序中高效使用。
Gson
Gson 是由Google开发 的,旨在将JSON转换为Java对象(POJO)及其反向。它简单且适合用于需要快速实现的小型应用程序。这个开源库提供以下关键功能:
- Gson具有最小的外部依赖性,因此易于集成。
- 它支持嵌套对象和复杂数据类型,如列表、映射和自定义类。
- 它可以使用TypeToken将JSON反序列化为通用集合,如
List<T>
,Map<K,V>
。 - Gson库的JsonSerializer和JsonDeserializer接口允许自定义实现。
- 默认情况下,在JSON输出中排除空值,如果需要,可以将空值包含在输出中。
- 注解
@SerializedName
将JSON键映射到具有不同名称的Java字段。 - Gson对象是线程安全的,因此可以在多线程应用程序中使用。
- GsonBuilder类可以为字段应用自定义命名策略。例如,
FieldNamingPolicy.IDENTITY
是默认策略,表示字段名不变。
在此比较中考虑的特殊情况
Feature | Jackson | GSON |
---|---|---|
额外字段 |
默认情况下被忽略,可配置。 |
默认情况下被忽略。 |
空值 |
支持@JsonInclude。 |
需要.serializeNulls()。 |
循环引用 |
支持使用@JsonIdentityInfo。 |
不直接支持。 |
数据处理 |
支持Java 8日期API与模块。 |
需要自定义类型适配器。 |
多态 |
内置@JsonTypeInfo。 |
需要自定义反序列化逻辑。 |
用于与Jackson和Gson库进行比较的输入JSON可在GitHub上找到。
JSON的模型类表示在GitHub上。
Jackson实现
上述JSON使用以下Jackson库转换为Java对象:
<!-- Jackson START-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.18.2</version>
</dependency>
<!-- Jackson END-->
使用Jackson库进行JSON解析的main类:
public class JacksonJsonMain {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
//Jackson Support for LocalDate using jackson-datatype-jsr310
mapper.registerModule(new JavaTimeModule());
//Configuration to ignore extra fields
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// Deserialize the JSON
EmployeeModelData employeeModelData = mapper.readValue(json, EmployeeModelData.class);
Employee employee=employeeModelData.getEmployee();
// display Json fields
System.out.println("Jackson Library parsing output");
System.out.println("Employee Name: " + employee.getName());
System.out.println("Department Name: " + employee.getDepartment().getName());
System.out.println("Skills: " + employee.getSkills());
System.out.println("Team Members Count: " + employeeModelData.getTeamMembers().size());
}
}
上述类的输出如下:
Gson实现
用于将上述JSON转换为Java对象的Gson依赖如下:
<!--GSON START -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
<!--GSON END -->
使用GSON库进行JSON解析的main类:
public class GsonJsonMain {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(LocalDate.class, new LocalDateAdapter()) // Register LocalDate adapter
.serializeNulls() // Handle null values
.setPrettyPrinting() // Pretty print JSON
.create();
// Deserialize the JSON
EmployeeModelData data = gson.fromJson(json, EmployeeModelData.class);
// Print Employee information
System.out.println("GSON Library parsing output");
System.out.println("Employee Name: " + data.getEmployee().getName());
System.out.println("Department Name: " + data.getEmployee().getDepartment().getName());
System.out.println("Skills: " + data.getEmployee().getSkills());
System.out.println("Team Members Count: " + data.getTeamMembers().size());
}
}
上述主类的输出如下:
我应该选择哪个?
Jackson提供高性能;因此,在项目涉及复杂数据结构或大型数据集时,必须使用它,而当数据集较小且数据结构简单时,必须使用Gson。
结论
这两个库都可以有效处理以上数据集,在JAVA中处理JSON解析时表现出色。上述比较有助于根据项目需求选择合适的库。
上述代码片段可以在GitHub存储库中找到。
关于Jackson和Gson之间的详细比较可在Baeldung上找到。Jackson官方文档提供了关于Jackson功能和配置的深入信息。同样,Gson官方文档提供了详细的实现指南。
Source:
https://dzone.com/articles/jackson-vs-gson-edge-cases-json-parsing-java