# 你不知道的JSON.stringify

我们都知道stringify可以将json转为字符串,但是它还有这样的功能:

我们以参数来看它的用法:

# 开始:

JSON.stringify(value [replacer] [flag])

  var obj={a:'AA',b:'BB',c:'CC'}
  var arr=['a','b','d']

下边均以此为例

# value:是必填字段。将要转换的目标对象、数组

console.log(
  JSON.stringify(obj)
)
//"{"a":"AA","b":"BB","c":"CC"}"
console.log(
  JSON.stringify(arr)
)
//"["a","b","d"]"

# replacer:可选字段,可以是Function或者Array

  • 是函数的时候,用来更改JSON.stringify的默认行为,函数接受两个参数key和value,是json的每一个键值对,我们可以通过处理然后return
//目标是对象的时候
function upperCase(key, value) {
  console.log(key,value);
  if(Object.prototype.toString.call(value)=="[object Object]"){
    return value
  }
  return value.toString().toUpperCase();
}
console.log(
  JSON.stringify(obj,upperCase)
)
// '' {a: "AA", b: "BB", c: "CC"} 第一次的键值对是空和对象本身
// a AA                           第二次为第一项键值对
// b BB                           ...
// c CC                           ...
// "{"a":"AA","b":"BB","c":"CC"}" 执行结果


//目标是数组的时候
function upperCase(key, value) {
  console.log(key,value);
  if(Object.prototype.toString.call(value)=="[object Array]"){
    return value
  }
  return value.toString().toUpperCase();
}
console.log(
  JSON.stringify(arr,upperCase)
)
// '' ["a", "b", "d"]     第一次的键值对是空和数组本身
// 0 a                    第二次为第一项索引和值
// 1 b                    ...
// 2 d                    ...
// ["A","B","D"]          执行结果
  • 是数组的时候,代表指定需要转成字符串的属性。
console.log(
  JSON.stringify(obj,arr)
)
//"{"a":"AA","b":"BB"}"
//只转换了arr里指定的a和b,由于obj里没有d,所以被忽略

//相当于执行了此方法:
function picking(obj,arr){
  var _obj={};
  for (var i = 0; i < arr.length; i++) {
    var key=arr[i];
    if(typeof obj[key] !== 'undefined' && !(obj[key] instanceof Function)){
      _obj[key]=obj[key]
    }
  }
  return JSON.stringify(_obj)
}
picking(obj,arr)
  • 如果第一个和第二个参数都是数组或者都是对象的话,会忽略第二个参数。

# flag:可选字段,作为分隔符

  • 可以是数字,表示每行缩进几个字符:
JSON.stringify(obj,false,5)

// "{
//      "a": "AA",
//      "b": "BB",
//      "c": "CC"
// }"
  • 可以是字符串,表示每个键值对的分隔符:
JSON.stringify(obj,false,'$$$')

// "{
// $$$"a": "AA",
// $$$"b": "BB",
// $$$"c": "CC"
// }"

//也可以放转义字符,例如'\n'
JSON.stringify(obj,false,'\n')

// "{
//
// "a": "AA",
//
// "b": "BB",
//
// "c": "CC"
// }"