Spring Boot中处理JSON的Jackson、Gson 和 JSON-B对比-Spring专区论坛-技术-SpringForAll社区

Spring Boot中处理JSON的Jackson、Gson 和 JSON-B对比

JSON 处理是现代 Spring Boot 应用程序的基石,尤其是在处理 API、大型有效载荷或复杂数据转换时。三种流行的库——JacksonGson 和 JSON-B——提供了强大的工具来处理 JSON 序列化和反序列化。然而,它们在性能功能自定义的便捷性方面存在显著差异。

在本篇深度探讨中,我们将探索:

  1. 每个库的优势和局限性。

  2. 大型有效载荷的性能基准测试。

  3. 高级配置,例如自定义数据格式和多态反序列化。

Spring Boot 中的 JSON 处理

Spring Boot 默认使用 Jackson 作为 JSON 序列化和反序列化的库。然而,开发者可以根据项目需求轻松切换到 Gson 或 JSON-B。选择合适的库取决于以下因素:

  • 有效载荷的大小和复杂性。

  • 是否需要自定义序列化逻辑。

  • 高负载下的性能表现。

Jackson、Gson 和 JSON-B 的比较

d2b5ca33bd20250108144852

 

性能基准测试

性能取决于有效载荷大小嵌套数据结构JSON 操作的频率等因素。我们在三种场景下测试了每个库的表现:

1. 小型Payload(10 KB)

{
  "id": 1,
  "name": "Sample",
  "tags": ["example", "test"],
  "created": "2023-12-01"
}

d2b5ca33bd20250108144844

 

2. 中型Payload(1 MB)

{
  "users": [
    {"id": 1, "name": "User1", "active": true},
    ...
    {"id": 10000, "name": "User10000", "active": false}
  ]
}

d2b5ca33bd20250108144830

 

3. 大型Payload(10 MB)

{
  "records": [
    {"id": 1, "data": {"field1": "...", "field2": "..."}},  
    ...
    {"id": 50000, "data": {"field1": "...", "field2": "..."}}
  ]
}

d2b5ca33bd20250108144756

在所有有效载荷大小下,Jackson 的序列化/反序列化速度最快。Gson 和 JSON-B 表现尚可,但在处理大型有效载荷时落后于 Jackson。

高级配置

1. 处理自定义数据格式

Jackson

Jackson 允许使用 JsonSerializer 和 JsonDeserializer 定义自定义序列化器和反序列化器。

自定义序列化器示例:

public class CustomDateSerializer extends JsonSerializer<LocalDate> {
    @Override
    public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    }
}

使用方法:

@JsonSerialize(using = CustomDateSerializer.class)
private LocalDate createdDate;

Gson

在 Gson 中,使用 JsonSerializer 和 JsonDeserializer 接口。

示例:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(LocalDate.class, (JsonSerializer<LocalDate>) (src, typeOfSrc, context) -> 
        new JsonPrimitive(src.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
    )
    .create();

JSON-B

JSON-B 提供了 JsonbAdapter 来实现类似的自定义功能。

示例:

public class LocalDateAdapter implements JsonbAdapter<LocalDate, String> {
    @Override
    public String adaptToJson(LocalDate date) {
        return date.format(DateTimeFormatter.ISO_DATE);
    }

    @Override
    public LocalDate adaptFromJson(String dateStr) {
        return LocalDate.parse(dateStr);
    }
}

2. 多态反序列化

在复杂系统中,通常需要处理多态类型(例如,将 JSON 反序列化为多个子类)。

Jackson

Jackson 原生支持多态,通过 @JsonTypeInfo 和 @JsonSubTypes 注解实现。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Admin.class, name = "admin"),
    @JsonSubTypes.Type(value = User.class, name = "user")
})
public abstract class Person { ... }

Gson

Gson 缺乏原生支持,需要自定义反序列化逻辑来实现多态。

JSON-B

JSON-B 不直接支持多态反序列化。可以使用外部库或通过自定义逻辑适配序列化。

3. 高效序列化大型有效载荷

基于流的序列化

Jackson 和 Gson 都支持基于流的处理,以提高内存效率。

Jackson 示例:

ObjectMapper mapper = new ObjectMapper();
try (JsonGenerator generator = mapper.getFactory().createGenerator(new File("output.json"), JsonEncoding.UTF8)) {
    generator.writeStartArray();
    for (DataObject obj : largeDataList) {
        mapper.writeValue(generator, obj);
    }
    generator.writeEndArray();
}

Gson 示例:

try (Writer writer = new FileWriter("output.json")) {
    Gson gson = new Gson();
    gson.toJson(largeDataList, writer);
}

总结

  1. 使用 Jackson 处理高性能、大型有效载荷以及需要多态反序列化等高级功能的场景。

  2. 选择 Gson 适用于轻量级用例或需要最小依赖的项目。

  3. 探索 JSON-B 适用于基于现代 Java EE 的应用程序,利用标准 API。

请登录后发表评论

    没有回复内容