以前用到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. IDEA优秀插件分享之---Mybatis Log Plugin

    小伙伴们在使用mybatis的时候有时候会出现一些sql异常,这个时候就需要对执行的sql语句进行检查.然而mybatis一般使用log4j打印执行的sql语句,类型下面这种的: 这个时候如果sql语 ...

  2. 使用nginx配置带有权限验证的反向代理

    环境:centos6u3 1.安装nginx (1)上传nginx nginx-1.14.0.tar.gz.可以从nginx官网下载http://nginx.org/en/download.html ...

  3. opencv归一化图像

    cv::normalize(src, dst, 0.0, 255.0, cv::NORM_MINMAX);

  4. Java高级-反射

    1.如何创建Class的实例 1.1过程:源文件经过编译(javac.exe)以后,得到一个或者多个.class文件..class文件经过运行(java.exe)这步,就需要进行类的加载(通过JVM的 ...

  5. HttpRuntime应用程序运行时

    System.Web.HttpRuntime类是整个Asp.net服务器处理的入口. 这个类提供了一系列的静态属性,反映web应用程序域的设置信息,而且每个web应用程序域中存在一个System.We ...

  6. Github上 10 个开源免费且优秀的后台控制面板

    Web 开发中几乎的平台都需要一个后台管理,但是从零开发一套后台控制面板并不容易,幸运的是有很多开源免费的后台控制面板可以给开发者使用,那么有哪些优秀的开源免费的控制面板呢?我在 Github 上收集 ...

  7. Flask-Login中装饰器@login_manager.user_loader的作用及原理

    Flask-Login通过装饰器@login_required来检查访问视图函数的用户是否已登录,没有登录时会跳转到login_manager.login_view = 'auth.login'所注册 ...

  8. ifream

    很早前看到一个说法,前端要尽量少用ifream,因为它让页面调试麻烦,互操作不方便,会增加http请求,重复加载资源导致内存增加,产生多个页面不好管理等等. 所以很多标准的设计中都推荐不要用ifrea ...

  9. django -- admin里的配置

    前戏 Django给我们提供了一个后台管理系统,方便我们进行数据表的管理 创建超级用户 python manage.py createsuperuser 配置 默认我们登录到后台不显示任何一张表,如果 ...

  10. [LeetCode] 102. Binary Tree Level Order Traversal 二叉树层序遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...