Java中不推荐用StringBuilder拼装复杂JSON或XML,因其不校验格式、不转义特殊字符、不处理嵌套结构;仅适用于结构固定、字段极少、性能敏感的简单场景,如心跳包或清洗后的日志组装。

Java 中用 StringBuilder 拼接 XML 或 JSON 报文,核心是“避免字符串重复创建”,但必须注意:它不校验格式、不转义特殊字符、不处理嵌套结构——适合简单、可控、性能敏感的场景(比如日志组装、内部协议生成),不适合替代 Jackson/Gson 或 DOM/JAXB。
拼接 XML 要手动处理转义和结构
XML 对 、<code>>、&、"、' 有严格转义要求,StringBuilder 不自动处理,必须自己做:
- 用
StringEscapeUtils.escapeXml11()(Apache Commons Text)或手写简单转义逻辑 - 标签必须严格配对,缩进靠人工控制(或用换行+制表符模拟)
- 属性值要用双引号包裹,且内容需转义
示例(简化版用户信息 XML):
StringBuilder xml = new StringBuilder();
xml.append("<user id='"").append(escapeXml(userId)).append(""'>
");
xml.append(" <name>").append(escapeXml(name)).append("</name>
");
xml.append(" <email>").append(escapeXml(email)).append("</email>
");
xml.append("</user>");
其中 escapeXml() 需自行实现或引入工具类,否则含 & 的邮箱(如 a&b@x.com)会导致 XML 解析失败。
拼接 JSON 更容易出错,慎用
JSON 要求双引号键名、字符串值必须用双引号、禁止尾逗号、数字不能加引号——StringBuilder 完全不检查这些:
- 键和字符串值都必须用
"包裹,且内部双引号要转义为" - 布尔值写
true/false,不要加引号;null直接写,不写"null" - 数组用
[...],对象用{...},括号必须成对
错误示例(看似正常,实则非法):
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
// ❌ 错误:name 值没转义引号,age 加了引号变成字符串
sb.append("{"name":"Zhang "San", "age":"25"}");
// ✅ 正确:转义内部引号,数字不加引号
sb.append("{"name":"Zhang \"San\"", "age":25}");
什么时候可以用?明确适用边界
适合以下情况:
- 报文结构固定、字段极少(如心跳包:
{"type":"heartbeat","ts":1712345678}) - 高频低延迟场景(如每秒万级日志埋点,且字段已清洗过)
- 嵌入式或受限环境(无法引入第三方 JSON/XML 库)
不适合:
- 字段来自用户输入或外部 API(风险高,易注入或格式崩坏)
- 嵌套对象或动态数组(手写逻辑极易漏括号、逗号)
- 需要校验、格式化、缩进输出的调试场景
比 StringBuilder 更稳的轻量替代方案
如果只是想避开大库但又要安全,可考虑:
- JSON:用 Gson 的
JsonWriter(流式写入,内存友好) - XML:用 StAX 的
XMLStreamWriter(边写边校验,支持命名空间) - 极简需求:封装一个带自动转义的小工具类,只暴露
addTag()、addProp()等方法,屏蔽底层拼接
不复杂但容易忽略:拼接后建议用正则或简单校验(如统计 { 和 } 数量是否相等)快速拦截明显错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










