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


相关推荐: 动图在线制作网站有哪些,滑动动图图集怎么做?  如何选择PHP开源工具快速搭建网站?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Android中AutoCompleteTextView自动提示  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  微信小程序 五星评分(包括半颗星评分)实例代码  图册素材网站设计制作软件,图册的导出方式有几种?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  英语简历制作免费网站推荐,如何将简历翻译成英文?  EditPlus中的正则表达式实战(5)  JavaScript常见的五种数组去重的方式  Mybatis 中的insertOrUpdate操作  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  详解jQuery停止动画——stop()方法的使用  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  如何在IIS中新建站点并配置端口与IP地址?  Internet Explorer官网直接进入 IE浏览器在线体验版网址  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何在搬瓦工VPS快速搭建网站?  HTML 中动态设置元素 name 属性的正确语法详解  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  C语言设计一个闪闪的圣诞树  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  高端网站建设与定制开发一站式解决方案 中企动力  如何登录建站主机?访问步骤全解析  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  PythonWeb开发入门教程_Flask快速构建Web应用  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Android仿QQ列表左滑删除操作  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Python结构化数据采集_字段抽取解析【教程】  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧