json.stringify的第三个参数用于控制缩进格式,可传入数字(如2、4)指定空格数或字符串(如'→ ')作自定义缩进符,配合replacer能过滤字段并美化输出,但需预先处理循环引用等非json-safe值。

JSON.stringify 的第三个参数可以是数字或字符串,用来控制输出的缩进和格式,让日志更易读、有层次感。
用数字指定缩进空格数
传入一个正整数(如 2、4),表示每个层级用多少个空格缩进:
- 数值为 2:每层缩进两个空格,适合大多数终端和日志查看器
- 数值为 4:更宽松的视觉分隔,适合嵌套较深的对象
- 数值为 0 或省略:不换行、无缩进,生成紧凑单行 JSON(默认行为)
例如:console.log(JSON.stringify(data, null, 2)) 输出带两级缩进的结构化文本。
用字符串作为自定义缩进符
传入字符串(如 ' '、'→ '、'• ')可实现个性化缩进标记:
- 字符串长度决定每级缩进宽度(如 '--' 是两个字符宽)
- 支持任意字符组合,比如用箭头或符号增强可读性,便于快速识别嵌套层级
- 注意避免使用控制字符或不可见字符,否则可能影响日志解析或显示
示例:JSON.stringify({a: {b: 1}}, null, '→ ') 会以 “→ ” 前缀逐层缩进。
结合 replacer 函数做字段过滤 + 缩进美化
第三个参数本身不处理内容,但可与第二个参数(replacer)配合,只保留关键字段并保持结构清晰:
- replacer 可以是数组(指定保留字段)或函数(动态过滤/转换值)
- 例如过滤敏感字段后,再用 2 缩进,既安全又整齐
- 常见场景:打印请求对象时剔除 token,同时保持 body、headers 等层级分明
示例:JSON.stringify(req, ['url', 'method', 'body'], 2)
注意点:循环引用与特殊值处理
即使用了缩进,JSON.stringify 仍会因循环引用报错,或忽略函数、undefined、Symbol 等值:
- 遇到循环引用需提前处理(如用 circular-json 库或自定义 replacer 拦截)
- Date 对象会转成 ISO 字符串,若需保留 Date 实例,需在 replacer 中手动格式化
- BigInt、Map、Set 不被原生支持,需自行序列化后再 stringify
所以定制缩进前,先确保数据是 JSON-safe 的,否则缩进再漂亮也出不来。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











