3

JSON.stringify()还能这么玩

JSON 值

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null

JSON 文件

JSON 文件的文件类型是 ".json"
JSON 文本的 MIME 类型是 "application/json"

规则

  1. 对象和数组
  • 属性名称必须是双引号括起来的字符串
  • 最后一个属性后不能有逗号
  1. 数值
  • 禁止出现前导零( JSON.stringify 方法自动忽略前导零,而在 JSON.parse 方法中将会抛出 SyntaxError)
  • 如果有小数点, 则后面至少跟着一位数字
  1. 字符串
  • 字符串必须用双引号括起来

方法

JSON.stringify

JSON.stringify(value[, replacer[, space]])

replacer:
可选。用于转换结果的函数或数组。

var str = {"name":"haha", "age":20};

JSON.stringify(str);   // {"name":"haha","age":20}

作为函数,它有两个参数,键(key)值(value)都会被序列化。

过滤函数以对象中的每一个属性和值作为输入,返回值有以下几种情况:

  • 如果返回一个 Number, 转换成相应的字符串被添加入JSON字符串。
  • 如果返回一个 String, 该字符串作为属性值被添加入JSON。
  • 如果返回一个 Boolean, "true" 或者 "false"被作为属性值被添加入JSON字符串
  • 返回undefined, 会被过滤掉
  • 属性值为任意函数或者symbol类型的,也会被过滤掉
  • 返回对象将会触发递归调用
JSON.stringify(str, function(key, val){
  console.log("key is ", key);
  console.log("val is  ", typeof(val));
  return val;
}

//======================
key is 
val is object
key is name
val is string
key is age
val is number

// {"name":"haha","age":20}
function replacer(key, value) {
  if (typeof value === "string") {
    return undefined;
  }
  return value;
}

var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
var jsonString = JSON.stringify(foo, replacer); 
// {"week":45,"month":7}

如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。

JSON.stringify(str, ["name", "haha", "kk"]);

// {"name":"haha"}

space:
可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:t。

JSON.stringify(str, null, 4);

//
{
    "name": "haha",
    "age": 20
}

toJSON()

如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为。

var data = {
  name:"niuzai",
  info:{
    age:18,
    sex:"male"
  },
  toJSON:function(){
    return "by toJSON";
  }
};

JSON.stringify(data);
//""by toJSON"";

JSON.parse()

JSON.parse(text[, reviver])

reviver:
可选,一个函数,它用来转换已经被从text字符串转为对象的对象,规则如下:

  1. 如果reviver返回一个有效值,则对应的属性值将替换为转换后的值。
  2. 如果reviver返回它接收的相同值,则不修改对应属性值。
  3. 如果reviver返回undefined,则删除对应的属性
function reviver(key,value){
  if(key=="webName"){
    return "antzone";
  }
  return value;
}
var jsonStr='{"webName":"蚂蚁部落","url":"softwhy.com","age":"2"}';
var obj=JSON.parse(jsonStr,reviver);
console.log(obj);

//
{
    age: "2",
    url: "softwhy.com",
    webName: "antzone"
}

zhouzhou
1.5k 声望76 粉丝

web前端