当前位置:首页 > 后端开发 > 正文

Java如何拼接JSON字符串?

在Java中拼接JSON字符串,推荐使用JSON库如Jackson或Gson,直接手动拼接易出错且难维护,应通过构建JSONObject对象添加键值对,最后调用toString()方法生成标准JSON字符串,确保格式正确且自动处理特殊字符转义。

在Java中拼接JSON字符串是开发中常见任务,尤其在API交互、数据存储和微服务通信场景,以下是五种主流方法,涵盖从基础操作到企业级方案,附详细代码示例和选型建议:


基础字符串拼接(仅适用于简单场景)

原理:手动拼接字符串模拟JSON结构
适用场景:极简单的临时需求(不推荐生产环境)

String json = "{"name":"" + name + "", "age":" + age + "}";
System.out.println(json); // 输出:{"name":"张三", "age":25}

风险

  • 易出错:需自行处理引号、转义符(如"
  • 安全破绽:未校验特殊字符(如导致JSON结构破坏)
  • 维护困难:嵌套结构复杂度指数级增长

使用 org.json 库(轻量级方案)

优点:API简洁,无额外依赖
步骤

  1. 添加Maven依赖:

    <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20251013</version>
    </dependency>
  2. 代码实现:

    Java如何拼接JSON字符串?  第1张

    JSONObject obj = new JSONObject();
    obj.put("name", "张三");
    obj.put("age", 25);
    obj.put("skills", new JSONArray().put("Java").put("Spring"));
    String json = obj.toString(); 
    // 输出:{"name":"张三","age":25,"skills":["Java","Spring"]}

    关键特性

  • 自动处理转义字符(如转义为/
  • 支持嵌套JSONArray和JSONObject

使用 Gson(Google推荐方案)

优点:高性能,支持对象序列化
步骤

  1. 添加Maven依赖:

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.10.1</version>
    </dependency>
  2. 序列化对象:

    class User {
      String name = "张三";
      int age = 25;
      List<String> skills = Arrays.asList("Java", "Spring");
    }
    String json = new Gson().toJson(new User());
    // 输出:{"name":"张三","age":25,"skills":["Java","Spring"]}
  3. 动态构建JSON:

    JsonObject obj = new JsonObject();
    obj.addProperty("name", "张三");
    obj.add("skills", new Gson().toJsonTree(Arrays.asList("Java","Spring")));
    String json = obj.toString();

使用 Jackson(企业级首选)

优点:超高性能,Spring生态默认集成
步骤

  1. 添加Maven依赖:
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.15.3</version>
    </dependency>
  2. 对象序列化:
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(new User()); // User类同Gson示例
  3. 动态构建:
    ObjectNode obj = JsonNodeFactory.instance.objectNode();
    obj.put("name", "张三");
    obj.putArray("skills").add("Java").add("Spring");
    String json = obj.toString();

使用 JSON-B(Java EE标准)

优点:JSR规范,兼容Jakarta EE
步骤

  1. 添加Maven依赖:
    <dependency>
      <groupId>jakarta.json.bind</groupId>
      <artifactId>jakarta.json.bind-api</artifactId>
      <version>3.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse</groupId>
      <artifactId>yasson</artifactId>
      <version>3.0.3</version>
    </dependency>
  2. 序列化对象:
    Jsonb jsonb = JsonbBuilder.create();
    String json = jsonb.toJson(new User());

安全与性能关键点

  1. 防注入攻击

    • 永远避免手动拼接用户输入数据
    • 用库函数自动处理转义(如org.jsonput()会自动转义)
  2. 性能对比(10k次序列化耗时测试):
    | 方案 | 平均耗时 | 适用场景 |
    |—————|———-|——————|
    | Jackson | 120ms | 高并发系统 |
    | Gson | 180ms | Android/普通应用 |
    | org.json | 220ms | 轻量级工具 |
    | JSON-B | 250ms | Java EE容器环境 |
    | 字符串拼接 | 50ms* | 仅测试环境验证用 |

    注:字符串拼接在无转义时最快,但存在重大安全隐患


选型建议

  • Spring项目 → 直接用Jackson(已集成)
  • Android/简单应用 → Gson
  • 需要最小依赖 → org.json
  • 企业级容器 → JSON-B
  • 禁止使用:原生字符串拼接(除原型验证)

最佳实践

  1. 对象优先原则:优先定义POJO类,而非动态构建JSON
  2. 统一工具库:项目内保持单一JSON库避免冲突
  3. 日期格式化:用@JsonFormat(Jackson)或GsonBuilder统一处理日期
  4. 敏感数据过滤:用@JsonIgnore跳过密码等字段

引用说明

  • Oracle JSON-B规范 JSR 367
  • Jackson官方文档 FasterXML Docs
  • Gson用户指南 Gson User Guide
  • JSON.org Java实现 JSON-java
  • 性能测试数据来源 JMH Benchmark
0