其实平常JSON.stringify也用的挺多的,但一直是stringify和parse互转,一直不知道JSON.stringify其实后面还有两个可选参数。
最近有这么一个需求,需要把一个对象转换为JSON,然后写入json文件
很简单吧
JSON.stringify({
"data": 123,
"test": {
"a": "qaqa",
"b": 111,
"c": "aaaa"
},
})
// '{"data":123,"test":{"a":"qaqa","b":111,"c":"aaaa"}}'
看起来没啥问题,但是打开文件后,这个json文件的所有内容都挤在了一行(图就不贴了)
很明显,是因为缺少换行符,导致json只有一行
然后我就去查如何在JSON.stringify的时候带上换行符,果不其然,JSON.stringify自己就有这个功能
JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。
语法
JSON.stringify(value[, replacer[, space]])
参数说明:
value:
必需, 要转换的 JavaScript 值(通常为对象或数组)。
replacer:
可选。用于转换结果的函数或数组。
如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。
如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。
space:
可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。
也就是第三个参数,space,比方说我们space中填2,就可以实现首行缩进的效果
JSON.stringify({
"data": 123,
"test": {
"a": "qaqa",
"b": 111,
"c": "aaaa"
},
},null,2)
// '{\n "data": 123,\n "test": {\n "a": "qaqa",\n "b": 111,\n "c": "aaaa"\n }\n}'
如果我们填写\n,就可以完成我这个需求了吧
JSON.stringify({
"data": 123,
"test": {
"a": "qaqa",
"b": 111,
"c": "aaaa"
},
},null,'\n')
// '{\n\n"data": 123,\n\n"test": {\n\n\n"a": "qaqa",\n\n\n"b": 111,\n\n\n"c": "aaaa"\n\n}\n}'
怎么好像不太对?为什么会有两个换行符?
好吧,那我改一下
JSON.stringify({
"data": 123,
"test": {
"a": "qaqa",
"b": 111,
"c": "aaaa"
},
},null,\n)
// Uncaught SyntaxError: Invalid or unexpected token
JSON.stringify({
"data": 123,
"test": {
"a": "qaqa",
"b": 111,
"c": "aaaa"
},
},null,0)
// '{"data":123,"test":{"a":"qaqa","b":111,"c":"aaaa"}}'
JSON.stringify({
"data": 123,
"test": {
"a": "qaqa",
"b": 111,
"c": "aaaa"
},
},null,'')
// '{"data":123,"test":{"a":"qaqa","b":111,"c":"aaaa"}}'
也就是说,如果你第三个参数存在且不为''或0时,它会自动添加换行符
那么我们第三个参数用空字符串\0就行了吧?
JSON.stringify({
"data": 123,
"test": {
"a": "qaqa",
"b": 111,
"c": "aaaa"
},
},null,'\0')
// '{\n"data": 123,\n"test": {\n"a": "qaqa",\n"b": 111,\n"c": "aaaa"\n}\n}'
果然,成功了