JSON.stringify序列化时如何生成带\n换行符的格式化字符串
问题说明
调用GitHub API获取仓库中npm包配置文件、lock文件时,接口返回编码数据,经解码、解析后可正常展示修改。修改完成后需要将内容重新序列化、编码后通过API提交回GitHub,直接调用JSON.stringify()序列化得到的是无换行、无缩进的单行压缩字符串,无法满足格式化要求,需要序列化结果中保留\n换行符实现标准的文件格式化效果。
预期格式化后的序列化结果带2空格缩进、层级间换行,和常规编辑器中展示的格式化JSON文件格式一致。
实现方法
JSON.stringify原生支持格式化输出,不需要引入额外第三方依赖,直接利用其第三个参数即可实现带换行、缩进的序列化效果。
语法说明
JSON.stringify(value, replacer, space)
参数说明:
value:必填,即你需要序列化的、修改完成的JavaScript对象(比如解析后的package.json内容对象)replacer:可选,用于自定义序列化过程中的字段过滤、转换逻辑,不需要特殊处理时直接传null即可space:可选,是控制缩进、换行的核心参数:- 传入数字时,表示每一层级缩进对应的空格数量,最大支持值为10,传入小于1的值不会生成缩进
- 传入字符串时,会将该字符串作为每一层级的缩进符号(比如传
'\t'即可实现Tab缩进效果)
代码示例
实现需要的2空格缩进、自动换行效果,直接按如下方式调用即可:
// 修改完成后的配置对象 const pkgData = { "name": "test-1", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "axios": "^0.15.2", "bluebird": "^2.0.7", "body-parser": "^1.8.3", "express": "^2.4.5", "istanbul": "^0.1.31", "mongoose": "^4.5.8" } } // 序列化生成带换行、2空格缩进的字符串 const serializedContent = JSON.stringify(pkgData, null, 2)
执行后得到的serializedContent就自带\n换行符和对应层级的缩进,和预期格式完全匹配。如果需要符合通用代码规范中“文件末尾保留空行”的要求,直接在序列化结果末尾拼接一个换行符即可:
const finalContent = JSON.stringify(pkgData, null, 2) + '\n'
得到的内容可以直接编码后提交给GitHub API,提交后仓库中的文件就是正常格式化的展示效果,不会出现单行压缩的问题。
内容的提问来源于stack exchange,提问作者Shashank Chaudhary
相关产品推荐
相关产品推荐

