以前用到JSON的场景也不少,但是没有仔细的研究过,这几天趁着一个需求用到了,就整理了一下相关用法。

一、 JSON.stringify()

1. 语法  JSON.stringify(value[, replacer [, space]])

2. 先说一下后面两个可选参数

space:是指定缩进用的空白字符串,用于美化输出,可以是数字或字符串。

 const data = {
a: 'bang',
b: null,
c: {
x: 'xxx',
y: 'yyy',
z: 90
},
d: 9527
}
JSON.stringify(data, null, 4)
// {
// "a": "bang",
// "b": null,
// "c": {
// "x": "xxx",
// "y": "yyy",
// "z": 90
// },
// "d": 9527
// }
JSON.stringify(data, null, '-')
// {
// -"a": "bang",
// -"b": null,
// -"c": {
// --"x": "xxx",
// --"y": "yyy",
// --"z": 90
// -},
// -"d": 9527
// }

replacer:转化规则,可以是一个函数或数组。

 // 1. 数组
const data = {
a: 'haha',
b: 123,
c: {
d: 8080,
e: null
}
};
JSON.stringify(data, ['b', 'd'])
// {"b":123}
JSON.stringify(data, ['a', 'c'])
// {"a":"haha","c":{}}
JSON.stringify(data, ['a', 'c', 'e'])
// {"a":"haha","c":{"e":null}}
 // 2. 函数
const data = {
a: 'haha',
b: 123,
c: {
b: '123',
d: 8080,
e: null
}
};
function rep (key, value) {
if (key === 'b' && typeof value === 'number') return ++value;
return value;
}
JSON.stringify(data, rep)
// {"a":"haha","b":124,"c":{"b":"123","d":8080,"e":null}}

3. value

将要序列化成 一个 JSON 字符串的值。这里面有一些类型是不能够转化的,undefined/function/symbol

  1). undefined

JSON.stringify遇到undefined时,是无法被返回的,但是null是可以的,所以我在这里的处理是把undefined 转化成null

这么做的理由是因为 undefined == null //true , 这样处理后的数据是不影响做模糊判断的。

2). function

同样是无法被返回的一种类型,我的处理是转成string类型存储,这么做产生的一个问题是 JSON.parse时需要再转成function

 let data = {
name: undefined,
age: 18,
type: null,
fn: ()=>{
return 999;
}
};
let rep = (key, value) => {
if (value === undefined) {
return null;
}
if (typeof value === 'function') {
return Function.prototype.toString.call(value);
}
return value;
}
JSON.stringify(data, rep)
//{"name":null,"age":18,"type":null,"fn":"()=>{\n return 999;\n }"}

3). symbol

es6新增的一种数据类型,具体留到另一篇文章里说。这里还是说JSON的问题。

 // 当value是Symbol 时,能被第二个参数指定,若不指定则无法返回
// 当key是Symbol 时,会被忽略,第二个参数无法指定
let data={name: 'aaa', symbol: Symbol()};
data[Symbol()] = 'bbb';
JSON.stringify(data,(key,value)=>{
console.log(key,value);
// name aaa
// symbol Symbol()
if (typeof value === 'symbol') return 'symbol'; //只有在这里指定才能返回结果
return value;
});
//{"name":"aaa","symbol":"symbol"}

  如果value 为Symbol,可以通过第二个参数来转换;但是key为Symbol的话,遍历的时候是无法遍历到的,就无法返回,类似于不可枚举类型:

 let data = Object.create(null, {
name: {
value: 'aaa',
enumerable: true
},
age: {
value: 18,
enumerable: false
}
});
let a = JSON.stringify(data, (key, value) => {
console.log(key, value);
//name aaa
return value;
})
console.log(a);
//{"name":"aaa"}

二、JSON.parse()

1. 语法:  JSON.parse(text[, reviver])

2. 参数:reviver 转换器, 如果传入该参数(函数),可以用来修改解析生成的原始值,调用时机在parse函数返回之前。

 let data = {
name: undefined,
age: 18,
type: null,
fn: () => {
return 999;
}
};
let rep = (key, value) => {
if (value === undefined) {
return null;
}
if (typeof value === 'function') {
return Function.prototype.toString.call(value);
}
return value;
}
let jsonS = JSON.stringify(data, rep);
//{"name":null,"age":18,"type":null,"fn":"()=>{\n return 999;\n }"}
let jsonR = JSON.parse(jsonS, (key, value)=>{
if (key) {
// return eval('('+value+')');
return new Function('return '+value)()
}
return value;
});
console.log(jsonR, jsonR.fn());
// { name: null, age: 18, type: null, fn: [Function] }
//

对于reviver 函数的处理用了eval 和 new Function 两种方式,因为eval的安全性问题,并不推荐使用,优先使用后一种方式。

三、toJSON

如果有toJSON,执行 .stringify时会先执行这个方法,再执行第二个参数

toJSON 是一个覆盖函数,要慎重使用。

 let data = {
name: 'nan',
age: 18,
toJSON: function () {
console.log('to');
return this.name;
}
};
JSON.stringify(data, (key,value)=>{
console.log('rep');
return value;
});
// to
// rep
// "nan"

总结:若希望用到JSON,对象中尽量只存储基础数据类型,不要出现以上几种对于数据化不友好的类型。

*** MDN文档   https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

JSON.stringify & JSON.parse 简析的更多相关文章

  1. JSON.stringify(),JSON.parse(),toJSON()使用方法总结

    今天在看<你不知道的javascript-中>第四章‘强制类型转换’的时候,发现JSON.stringify(),JSON.parse(),toJSON()有很多细节,自己也就总结测试了一 ...

  2. JSON.stringify() / JSON.parse()

    JSON.stringify() 这个方法可以把javascript对象转换成json字符串. JSON.parse() 这个方法可以把 json 字符串转换成 javascript对象. [下面来看 ...

  3. JSON.stringify(),JSON.parse(),toJSON()方法使用

    JSON.stringify(),将value(Object,Array,String,Number...)序列化为JSON字符串    JSON.parse(), 将JSON数据解析为js原生值   ...

  4. JSON stringify and parse

    来源 : http://javascript.ruanyifeng.com/stdlib/date.html //解析json也可以传入一个方法, 基本上和stringify差不多,不过是逆序的, 要 ...

  5. JSON.stringify(),JSON.parse(),eval(string)

      JSON.stringify()用于从一个对象解析出字符串 : var obj = {"name":"week","age":" ...

  6. JSON.stringify,JSON.parse方法

    var obj={name:'zhangsan',age:'18'};/** js对象--->JSON字符串* JSON.stringify(js对象) --转化为--> JSON字符串* ...

  7. 解决IE6 IE7 JSON.stringify JSON 未定义问题

    在项目中引入json2.js 官方http://www.json.org/ 源码地址:https://github.com/douglascrockford/JSON-js $.ajax({ url: ...

  8. JSON.parse() 和 JSON.stringify()

    JSON.parse()和JSON.stringify()   1.parse 用于从一个字符串中解析出json 对象.例如 var str='{"name":"cpf& ...

  9. JSON.parse()与JSON.stringify()高级用法

    JSON.parse()与JSON.stringify是将JSON对象与字符串互相转换的方法,它们还有一些参数可以让我们在实际应用中更加方便,现在介绍一下它们的高级用法 JSON.parse() JS ...

随机推荐

  1. Rust语言中的常量,变量,运算符,数据类型

    简单练练, 夏天太热. const MAX_POINTS: u32 = 100_100; fn main() { let mut x = 5; let y = 5; let y = y + 1; le ...

  2. vue-router路由传参之query和params

    首先简单来说明一下$router和$route的区别 //$router : 是路由操作对象,只写对象 //$route : 路由信息对象,只读对象 //操作 路由跳转 this.$router.pu ...

  3. c# 第七节 编程规范,vs中的各种设置

    本节内容: 1:编程规范 2:vs中的各种设置 3:一个解决方案多个项目的创建.使用 1:编程规范 需要规范的地方: 1: 2: 2:vs中的各种设置 实现: 3:一个解决方案多个项目的创建.使用

  4. centos7-cockpit

    yum install cockpit* -y systemctl start cockpit.service systemctl enable cockpit.service 修改默认端口9090 ...

  5. python27期day12:推导式、内置函数、高阶函数、匿名函数、作业题

    1.推导式:做一些有规律的数据结构 列表推导式: 普通循环模式: [加工后的变量 for 循环] 示例一:print([i for i in range(1,51)]) 结果:[1, 2, 3, 4, ...

  6. Hbase多条件查询数据(FilterList)

    利用Filter进行筛选:HBase的Scan可以通过setFilter方法添加过滤器(Filter),这也是分页.多条件查询的基础.HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBas ...

  7. Jike_Time

    数据分析全景图 1. 数据采集.它是我们的原材料,也是最“接地气”的部分,因为任何分析都要有数据源. 2. 数据挖掘.它可以说是最“高大上”的部分,也是整个商业价值所在.之所以要进行数据分析,就是要找 ...

  8. linux翻页及字符串搜索操作

    向下翻动一屏幕: space, ctrl + f, ctrl + v, ctrl + F 向下翻动半屏: d, ctrl + D 向下翻动一行: 回车, e, j 向上翻动一屏幕: b, ctrl + ...

  9. 【UVA1303】Wall(凸包)

    点此看题面 大致题意: 给你一个多边形,要求建一面墙使得墙上的点至少离多边形每个顶点\(R\)的距离,求最短的墙长. 考虑\(R=0\) 考虑当\(R=0\)时,所求的答案显然就是求得的凸包的周长. ...

  10. [LeetCode] 88. Merge Sorted Array 混合插入有序数组

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ...