JSON.stringify(value[, replacer [, space]])三个参数
- value: 将要序列化成 一个JSON 字符串的值。
- replacer: 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化;
- space: 指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON.stringify()</title>
</head>
<body>
<!-- -->
<script>
// 传一个对象,生成JSON字符串
var obj= {name: 'robin', age: 24}
console.log(JSON.stringify(obj)) // {"name":"robin","age":24}
// 索引为字符串的数组是不可枚举的,在JSON中没有任何意义
var arr = [1,2]
console.log(arr) // [1, 2]
arr['add'] = 3
console.log(JSON.stringify(arr)) // [1,2]
// 底层是toJSON方法
console.log(JSON.stringify({x:1, y:2, toJSON(){return this.x+this.y}})) // 3
// 如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为
var und = {name: undefined, age: undefined, sleep: 22}
console.log(JSON.stringify(und)) // {"sleep":22}
// 过滤属性
function replacer(key, value) {
if(typeof value == 'string') {
return undefined
}
return value
}
var foo = {foundation: 'Mozilla', model: 'box', week: 45, transport: 'car', month: 7};
console.log(JSON.stringify(foo, replacer)) // {"week":45,"month":7}
// 过滤属性其他方法
console.log(JSON.stringify(foo, ['model', 'transport'])) // {"model":"box","transport":"car"}
// 第三参数space用来控制结果字符串里面的间距。如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);如果是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符)。
var data = {
name:"niuzai",
info:{
age:18,
sex:"male"
}
};
console.log(JSON.stringify(data, null, 2))
// {
// "name": "niuzai",
// "info": {
// "age": 18,
// "sex": "male"
// }
// }
console.log(JSON.stringify(data, null, 'hello world'))
// {
// hello worl"name": "niuzai",
// hello worl"info": {
// hello worlhello worl"age": 18,
// hello worlhello worl"sex": "male"
// hello worl}
// }
// toJSON
var obj = {
data: 'data',
toJSON(key){
if(key)
return `Now I am a nested object under key '${key}'`;
else
return this;
}
};
console.log(JSON.stringify(obj)) // 如果该对象是属性值,则为属性名
// '{"data":"data"}' key
console.log(JSON.stringify({ obj })) // 如果直接在该对象上调用JSON.stringify(),则为空字符串
// '{"obj":"Now I am a nested object under key 'obj'"}' key obj
console.log(JSON.stringify([ obj ])) // 如果它在数组中,则数组中的索引作为字符串
// '["Now I am a nested object under key '0'"]' key 0
// 如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用 toJSON 方法后的返回值会被序列化,例如:
var obj = {
foo: 'foo',
toJSON: function () {
return 'bar';
}
};
JSON.stringify(obj); // '"bar"'
JSON.stringify({x: obj}); // '{"x":"bar"}'
</script>
<script>
$.each(data, function(index, item) {
let obj = JSON.parse(JSON.stringify(item, ["CustomTableItemID", "Name", "StartDate", "EndDate"]), function(key, value) {
if(key == "StartDate") {
return dateFormat(Number(value), 'MMM DD, YYYY');
}
return value;
} )
});
</script>
</body>
</html>