遗忘的JSON.stringify的第三个参数

1,109 阅读2分钟

其实平常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}'

果然,成功了