上一篇
Java如何拼接JSON字符串?
- 后端开发
- 2025-07-04
- 4509
在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简洁,无额外依赖
步骤:
-
添加Maven依赖:
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20251013</version> </dependency>
-
代码实现:
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推荐方案)
优点:高性能,支持对象序列化
步骤:
-
添加Maven依赖:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
-
序列化对象:
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"]}
-
动态构建JSON:
JsonObject obj = new JsonObject(); obj.addProperty("name", "张三"); obj.add("skills", new Gson().toJsonTree(Arrays.asList("Java","Spring"))); String json = obj.toString();
使用 Jackson(企业级首选)
优点:超高性能,Spring生态默认集成
步骤:
- 添加Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.3</version> </dependency>
- 对象序列化:
ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(new User()); // User类同Gson示例
- 动态构建:
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
步骤:
- 添加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>
- 序列化对象:
Jsonb jsonb = JsonbBuilder.create(); String json = jsonb.toJson(new User());
安全与性能关键点
-
防注入攻击:
- 永远避免手动拼接用户输入数据
- 用库函数自动处理转义(如
org.json
的put()
会自动转义)
-
性能对比(10k次序列化耗时测试):
| 方案 | 平均耗时 | 适用场景 |
|—————|———-|——————|
| Jackson | 120ms | 高并发系统 |
| Gson | 180ms | Android/普通应用 |
| org.json | 220ms | 轻量级工具 |
| JSON-B | 250ms | Java EE容器环境 |
| 字符串拼接 | 50ms* | 仅测试环境验证用 |注:字符串拼接在无转义时最快,但存在重大安全隐患
选型建议
- Spring项目 → 直接用Jackson(已集成)
- Android/简单应用 → Gson
- 需要最小依赖 → org.json
- 企业级容器 → JSON-B
- 禁止使用:原生字符串拼接(除原型验证)
最佳实践
- 对象优先原则:优先定义POJO类,而非动态构建JSON
- 统一工具库:项目内保持单一JSON库避免冲突
- 日期格式化:用
@JsonFormat
(Jackson)或GsonBuilder
统一处理日期 - 敏感数据过滤:用
@JsonIgnore
跳过密码等字段
引用说明:
- Oracle JSON-B规范 JSR 367
- Jackson官方文档 FasterXML Docs
- Gson用户指南 Gson User Guide
- JSON.org Java实现 JSON-java
- 性能测试数据来源 JMH Benchmark