Java 17 中 Map 与 JSON 互转的 3 种现代方案:原生、Jackson 与 Fastjson2
2026/7/11 9:01:13 网站建设 项目流程

Java 17 中 Map 与 JSON 互转的 3 种现代方案:原生、Jackson 与 Fastjson2

在现代 Java 开发中,数据交换格式的处理是每个开发者都无法回避的话题。JSON 作为一种轻量级的数据交换格式,因其简洁、易读和跨平台的特性,已经成为前后端交互、微服务通信等领域的事实标准。而 Map 作为 Java 中最常用的数据结构之一,与 JSON 之间的转换需求更是频繁出现。本文将深入探讨 Java 17 环境下三种主流的 Map 与 JSON 互转方案,帮助开发者根据项目需求做出明智选择。

1. Java 原生方案:简洁但有限

Java 17 引入了一些新特性,使得不依赖第三方库处理 JSON 成为可能。虽然功能相对基础,但对于简单场景已经足够。

1.1 使用 Record 和 Map.of 创建数据

Java 17 的 Record 类型为数据载体类提供了简洁的语法糖:

public record User(String name, int age) {} // 创建 Map var userMap = Map.of("name", "张三", "age", 25);

1.2 原生 JSON 处理(Java 17+)

Java 虽然没有内置完整的 JSON 库,但可以通过组合现有 API 实现基本功能:

import java.util.Map; import java.util.stream.Collectors; public class NativeJsonConverter { // Map 转 JSON 字符串(简化版) public static String mapToJson(Map<String, Object> map) { return map.entrySet().stream() .map(entry -> "\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"") .collect(Collectors.joining(",", "{", "}")); } // 使用示例 public static void main(String[] args) { Map<String, Object> data = Map.of( "username", "john_doe", "active", true, "score", 95.5 ); String json = mapToJson(data); System.out.println(json); // 输出: {"username":"john_doe","active":"true","score":"95.5"} } }

注意:这种原生实现非常基础,无法处理复杂嵌套结构和各种数据类型。对于生产环境,建议使用专业 JSON 库。

2. Jackson:企业级首选方案

Jackson 是 Java 生态中最成熟、功能最全面的 JSON 处理库,被 Spring 等主流框架采用作为默认 JSON 处理器。

2.1 基本配置与使用

首先添加 Maven 依赖:

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

基础转换示例:

import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Map; public class JacksonConverter { private static final ObjectMapper mapper = new ObjectMapper(); // Map 转 JSON public static String mapToJson(Map<String, Object> map) throws Exception { return mapper.writeValueAsString(map); } // JSON 转 Map public static Map<String, Object> jsonToMap(String json) throws Exception { return mapper.readValue(json, Map.class); } public static void main(String[] args) throws Exception { Map<String, Object> complexMap = Map.of( "user", Map.of("name", "李四", "roles", List.of("admin", "editor")), "timestamp", Instant.now().toString() ); String json = mapToJson(complexMap); System.out.println("Serialized JSON: " + json); Map<String, Object> deserialized = jsonToMap(json); System.out.println("Deserialized map: " + deserialized); } }

2.2 高级特性

Jackson 的强大之处在于其丰富的配置和扩展能力:

// 配置美化输出 mapper.enable(SerializationFeature.INDENT_OUTPUT); // 处理 Java 8 时间类型 mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 忽略空值 mapper.setSerializationInclusion(Include.NON_NULL); // 自定义序列化 SimpleModule module = new SimpleModule(); module.addSerializer(LocalDate.class, new LocalDateSerializer()); mapper.registerModule(module);

Jackson 的主要优势:

  • 成熟稳定:经过大量生产环境验证
  • 高性能:处理速度快,内存占用低
  • 扩展性强:支持自定义序列化逻辑
  • 功能全面:支持流式 API、树模型等多种处理模式

3. Fastjson2:性能怪兽的涅槃重生

Fastjson 曾因性能优异而广受欢迎,但也因安全问题饱受诟病。Fastjson2 是其重写版本,在保持高性能的同时大幅提升了安全性。

3.1 基本使用

添加依赖:

<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.34</version> </dependency>

转换示例:

import com.alibaba.fastjson2.JSON; import java.util.Map; public class Fastjson2Converter { // Map 转 JSON public static String mapToJson(Map<String, Object> map) { return JSON.toJSONString(map); } // JSON 转 Map public static Map<String, Object> jsonToMap(String json) { return JSON.parseObject(json, Map.class); } public static void main(String[] args) { Map<String, Object> data = Map.of( "product", "笔记本电脑", "specs", Map.of("cpu", "i7", "ram", "16GB"), "price", 6999.99, "inStock", true ); String json = mapToJson(data); System.out.println("Fastjson2 序列化: " + json); Map<String, Object> result = jsonToMap(json); System.out.println("Fastjson2 反序列化: " + result.get("product")); } }

3.2 安全配置建议

Fastjson2 提供了多种安全防护机制:

// 启用安全模式(推荐) JSON.config(JSON.Feature.SecureMode); // 自定义反序列化过滤器 JSON.config(JSON.Feature.SupportAutoType, false); // 设置最大解析层级 JSON.config(JSON.Feature.MaxNestingDepth, 100); // 设置最大解析长度 JSON.config(JSON.Feature.MaxStringLength, 10_000_000);

4. 方案对比与选型建议

下表对比了三种方案的关键特性:

特性Java 原生JacksonFastjson2
性能极高
功能完整性基础全面较全面
安全性中(需配置)
社区活跃度N/A非常活跃活跃
学习曲线简单中等简单
对 Java 17 新特性支持优秀良好良好
生产环境适用性仅限简单场景企业级推荐性能敏感场景

选型建议:

  • 追求稳定和功能全面:选择 Jackson
  • 极端性能需求:考虑 Fastjson2(需做好安全配置)
  • 简单临时需求:可使用 Java 原生方案
  • 微服务/Spring 生态:优先使用 Jackson(Spring 默认集成)

5. 实战技巧与常见问题

5.1 处理复杂嵌套结构

对于多层嵌套的 Map 结构,建议使用类型安全的 DTO 类而非直接操作 Map:

public record OrderItem(String sku, int quantity) {} public record Order(String id, List<OrderItem> items) {} // 使用 Jackson 处理 Order order = new Order("123", List.of( new OrderItem("A100", 2), new OrderItem("B200", 1) )); String json = mapper.writeValueAsString(order); Order deserialized = mapper.readValue(json, Order.class);

5.2 性能优化建议

  • 重用 ObjectMapper:创建成本高,应全局共享

  • 使用 Jackson 的流式 API处理大文件:

    // 流式写入 JsonGenerator generator = mapper.createGenerator(new File("large.json")); generator.writeStartObject(); generator.writeStringField("name", "value"); generator.writeEndObject(); generator.close(); // 流式读取 JsonParser parser = mapper.createParser(new File("large.json")); while (parser.nextToken() != null) { // 处理每个token } parser.close();
  • 对于静态结构:考虑使用 Jackson 的@JsonFormat注解预先定义格式

5.3 日期时间处理最佳实践

三种方案对 Java 8 时间类型的支持:

// Jackson 需要注册 JavaTimeModule mapper.registerModule(new JavaTimeModule()); // Fastjson2 自动支持 Java 8 时间类型 JSON.config(JSON.Feature.UseISO8601DateFormat); // 原生方案需要手动格式化 DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; String formatted = formatter.format(Instant.now());

5.4 处理特殊字符和 Unicode

确保正确处理特殊字符:

Map<String, Object> specialChars = Map.of( "normal", "普通文本", "special", "换行\n制表\t符", "unicode", "😊 Unicode 表情" ); // Jackson 默认会转义特殊字符 String jacksonJson = mapper.writeValueAsString(specialChars); // Fastjson2 也支持完整 Unicode String fastjson2Json = JSON.toJSONString(specialChars);

6. 安全考量与防御性编程

JSON 处理中的常见安全问题及防护措施:

  1. 反序列化漏洞

    • Fastjson 历史版本存在严重漏洞
    • 防护措施:
      // Fastjson2 安全配置 JSON.config(JSON.Feature.SecureMode); JSON.config(JSON.Feature.SupportAutoType, false); // Jackson 安全配置 mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
  2. DoS 攻击防护

    • 限制最大解析深度和长度
    • 设置合理的超时时间
  3. 敏感数据过滤

    • 使用@JsonIgnore注解忽略敏感字段
    • 实现自定义序列化器过滤特定内容

7. 未来展望与替代方案

虽然本文介绍了三种主流方案,但 Java 生态中还有其他值得关注的 JSON 库:

  • Gson:Google 出品,API 设计简洁
  • JSON-B:Java EE 标准 API,实现如 Eclipse Yasson
  • Jsoniter:号称最快的 JSON 解析器

对于 Java 21+ 用户,可以期待 Project Amber 带来的更多模式匹配和记录类增强,这些特性将进一步提升 JSON 处理的便利性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询