Gson需用GsonBuilder().setPrettyPrinting()启用格式化输出,Jackson需enable(SerializationFeature.INDENT_OUTPUT),org.json可用JSONObject.toString(indentFactor);三者均仅用于调试,不可用于生产响应或存储。

用 Gson 的 GsonBuilder 启用格式化输出
默认 Gson 的 toJson() 返回的是紧凑(minified)JSON 字符串,没有换行和缩进。要美化打印,必须显式构建带格式化选项的 Gson 实例。
关键点是调用 setPrettyPrinting(),它会启用缩进(2 空格)、换行和键排序(按字典序)。注意:该设置只影响序列化(toJson),不影响反序列化。
Gson gson = new GsonBuilder().setPrettyPrinting().create();- 对
Map、List、自定义 POJO 都生效 - 如果对象含循环引用,
setPrettyPrinting()不会阻止StackOverflowError,仍需配合disableHtmlEscaping()或自定义TypeAdapter - 性能略低于默认 Gson(因生成更多空白字符),但调试阶段可忽略
用 Jackson 的 ObjectMapper 启用缩进输出
Jackson 默认也不格式化。需要配置 SerializationFeature.INDENT_OUTPUT 为 true,这是最直接的方式。
与 Gson 不同,Jackson 的缩进是可配置的:默认用 2 空格,但可通过 DefaultIndenter 替换为制表符或自定义空格数。
立即学习“Java免费学习笔记(深入)”;
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);- 若需 4 空格缩进:
mapper.setDefaultPrettyPrinter(new DefaultPrettyPrinter().indentObjectsWith(new DefaultIndenter(" ", "\n"))); - 注意
INDENT_OUTPUT对 null 值、空集合、时间类型等保持原语义,不会额外添加字段 - 若 JSON 中含 Unicode 字符(如中文),建议同时调用
configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true)避免终端乱码
不依赖库时,用 org.json 的 JSONObject.toString(indentFactor)
如果项目已引入 org.json(比如 Android 或轻量服务),它自带美化能力,无需额外引入 Gson/Jackson。
toString(int) 参数是每级缩进的空格数,传 2 或 4 最常用;传 0 则退化为紧凑格式。
-
new JSONObject(jsonString).toString(2)—— 直接美化已有字符串(前提是合法 JSON) - 失败时抛
JSONException,所以务必 try-catch,尤其当输入不可信时 - 不支持流式处理,必须加载整个 JSON 到内存;大 JSON(>1MB)易 OOM
- 对日期、BigDecimal 等类型无特殊序列化逻辑,纯字符串解析/生成,适合简单场景
常见错误:美化后日志里出现多余换行或乱码
美化后的 JSON 含 \n 和空格,在 SLF4J / Log4j 等日志框架中可能被截断、折叠,或在 Kibana 等 UI 里显示为单行(因 HTML 渲染忽略空白)。
根本原因不是 JSON 本身错,而是日志输出链路未保留空白。解决思路分两层:
- 确认日志 appender 是否启用了
layout的pattern包含换行符支持(如 Logback 的%replace(%msg){'\n', '\n'}不够,要用%replace(%msg){'\n', '配合 HTML layout)
'} - 更稳妥做法:调试时用
System.out.println()或 IDE 控制台直接看;上生产环境应关闭美化,仅在log.debug()且isDebugEnabled()为 true 时才调用美化方法 - 若用 Lombok 的
@ToString打印含 JSON 字段的对象,记得加includeFieldNames = true,否则美化过的字符串会被当成普通字符串再次转义
美化只是调试辅助,别让它混进 API 响应体或数据库存储字段——多出的空白字符会增大体积、干扰签名验证、拖慢解析速度。











