java格式化输出json字符串_使用Gson或Jackson美化打印JSON

发布时间 - 2026-02-01 00:00:00    点击率:
Gson需用GsonBuilder().setPrettyPrinting()启用格式化输出,Jackson需enable(SerializationFeature.INDENT_OUTPUT),org.json可用JSONObject.toString(indentFactor);三者均仅用于调试,不可用于生产响应或存储。

用 Gson 的 GsonBuilder 启用格式化输出

默认 GsontoJson() 返回的是紧凑(minified)JSON 字符串,没有换行和缩进。要美化打印,必须显式构建带格式化选项的 Gson 实例。

关键点是调用 setPrettyPrinting(),它会启用缩进(2 空格)、换行和键排序(按字典序)。注意:该设置只影响序列化(toJson),不影响反序列化。

  • Gson gson = new GsonBuilder().setPrettyPrinting().create();
  • MapList、自定义 POJO 都生效
  • 如果对象含循环引用,setPrettyPrinting() 不会阻止 StackOverflowError,仍需配合 disableHtmlEscaping() 或自定义 TypeAdapter
  • 性能略低于默认 Gson(因生成更多空白字符),但调试阶段可忽略

用 Jackson 的 ObjectMapper 启用缩进输出

Jackson 默认也不格式化。需要配置 SerializationFeature.INDENT_OUTPUTtrue,这是最直接的方式。

与 Gson 不同,Jackson 的缩进是可配置的:默认用 2 空格,但可通过 DefaultIndenter 替换为制表符或自定义空格数。

  • 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.jsonJSONObject.toString(indentFactor)

如果项目已引入 org.json(比如 Android 或轻量服务),它自带美化能力,无需额外引入 Gson/Jackson。

toString(int) 参数是每级缩进的空格数,传 24 最常用;传 0 则退化为紧凑格式。

  • new JSONObject(jsonString).toString(2) —— 直接美化已有字符串(前提是合法 JSON)
  • 失败时抛 JSONException,所以务必 try-catch,尤其当输入不可信时
  • 不支持流式处理,必须加载整个 JSON 到内存;大 JSON(>1MB)易 OOM
  • 对日期、BigDecimal 等类型无特殊序列化逻辑,纯字符串解析/生成,适合简单场景

常见错误:美化后日志里出现多余换行或乱码

美化后的 JSON 含 \n 和空格,在 SLF4J / Log4j 等日志框架中可能被截断、折叠,或在 Kibana 等 UI 里显示为单行(因 HTML 渲染忽略空白)。

根本原因不是 JSON 本身错,而是

日志输出链路未保留空白。解决思路分两层:

  • 确认日志 appender 是否启用了 layoutpattern 包含换行符支持(如 Logback 的 %replace(%msg){'\n', '\n'} 不够,要用
    %replace(%msg){'\n', '
    '}
    配合 HTML layout)
  • 更稳妥做法:调试时用 System.out.println() 或 IDE 控制台直接看;上生产环境应关闭美化,仅在 log.debug()isDebugEnabled() 为 true 时才调用美化方法
  • 若用 Lombok 的 @ToString 打印含 JSON 字段的对象,记得加 includeFieldNames = true,否则美化过的字符串会被当成普通字符串再次转义

美化只是调试辅助,别让它混进 API 响应体或数据库存储字段——多出的空白字符会增大体积、干扰签名验证、拖慢解析速度。


# java  # html  # android  # js  # json  # app  # 格式化输出  # 字符串解析  # overflow  # logback  # log4j  # NULL  # try  # catch  # 字符串  # int  # 循环  # map  # 对象  # ide  # 数据库  # ui  # 自定义  # 换行  # 序列化  # 的是  # 这是  # 也不  # 已有  # 要用  # 不支持  # 让它 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么连接多个数据库_Laravel多数据库连接配置  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何快速搭建个人网站并优化SEO?  canvas 画布在主流浏览器中的尺寸限制详细介绍  香港服务器租用每月最低只需15元?  如何利用DOS批处理实现定时关机操作详解  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何配置和使用缓存?(Redis代码示例)  实例解析Array和String方法  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel如何使用withoutEvents方法临时禁用模型事件  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  如何在腾讯云免费申请建站?  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  如何登录建站主机?访问步骤全解析  Firefox Developer Edition开发者版本入口  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  海南网站制作公司有哪些,海口网是哪家的?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Laravel PHP版本要求一览_Laravel各版本环境要求对照  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel Fortify是什么,和Jetstream有什么关系  如何在七牛云存储上搭建网站并设置自定义域名?  微信小程序 闭包写法详细介绍  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何快速搭建自助建站会员专属系统?  如何用景安虚拟主机手机版绑定域名建站?  Laravel如何使用Blade组件和插槽?(Component代码示例)  怎么用AI帮你设计一套个性化的手机App图标?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  如何在VPS电脑上快速搭建网站?  网站建设整体流程解析,建站其实很容易!  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  zabbix利用python脚本发送报警邮件的方法  SQL查询语句优化的实用方法总结  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何快速生成凡客建站的专业级图册?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南