付费节点推荐
免费节点
节点使用教程
概述
JSON.stringify()
方法可以将任意的 JavaScript 值序列化成 JSON 字符串。
语法
JSON.stringify(value[, replacer [, space]])
参数
value
- 将要序列化成 JSON 字符串的值。
replacer
可选- 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中。关于该参数更详细的解释和示例,请参考使用原生的 JSON 对象一文。
space
可选- 指定缩进用的空白字符串,用于美化输出(pretty-print)。
描述
关于序列化,有下面五点注意事项:
- 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
- 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
undefined、
任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成null
(出现在数组中时)。- 所有以 symbol 为属性键的属性都会被完全忽略掉,即便
replacer
参数中强制指定包含了它们。 - 不可枚举的属性会被忽略
JSON.stringify({}); // '{}'
JSON.stringify(true); // 'true'
JSON.stringify("foo"); // '"foo"'
JSON.stringify([1, "false", false]); // '[1,"false",false]'
JSON.stringify({ x: 5 }); // '{"x":5}'JSON.stringify({x: 5, y: 6});
// '{"x":5,"y":6}' 或者 '{"y":6,"x":5}' 都可能
JSON.stringify([new Number(1), new String("false"), new Boolean(false)]);
// '[1,"false",false]'
JSON.stringify({x: undefined, y: Object, z: Symbol("")});
// '{}'
JSON.stringify([undefined, Object, Symbol("")]);
// '[null,null,null]'
JSON.stringify({[Symbol("foo")]: "foo"});
// '{}'
JSON.stringify({[Symbol.for("foo")]: "foo"}, [Symbol.for("foo")]);
// '{}'
JSON.stringify({[Symbol.for("foo")]: "foo"}, function (k, v) {
if (typeof k === "symbol"){
return "a symbol";
}
});// '{}'
// 不可枚举的属性默认会被忽略:
JSON.stringify( Object.create(null, { x: { value: 'x', enumerable: false }, y: { value: 'y', enumerable: true } }) );
// '{"y":"y"}'
space
参数
space 参数用来控制结果字符串里面的间距。如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);如果是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符)。
JSON.stringify({ a: 2 }, null, " "); // '{\n "a": 2\n}'
使用制表符(\t)来缩进:
JSON.stringify({ uno: 1, dos : 2 }, null, '\t')
// '{ \
// "uno": 1, \
// "dos": 2 \
// }'
toJSON 方法
如果一个被序列化的对象拥有 toJSON
方法,那么该 toJSON
方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用 toJSON
方法后的返回值会被序列化,例如:
var obj = {
foo: 'foo',
toJSON: function () {
return 'bar';
}
};
JSON.stringify(obj); // '"bar"'
JSON.stringify({x: obj}); // '{"x":"bar"}'
使用 JSON.stringify 结合 localStorage 的例子
一些时候,你想存储用户创建的一个对象,并且,即使在浏览器被关闭后仍能恢复该对象。下面的例子是 JSON.stringify
适用于这种情形的一个样板:
// 创建一个示例数据
var session = {
'screens' : [],
'state' : true
};
session.screens.push({"name":"screenA", "width":450, "height":250});
session.screens.push({"name":"screenB", "width":650, "height":350});
session.screens.push({"name":"screenC", "width":750, "height":120});
session.screens.push({"name":"screenD", "width":250, "height":60});
session.screens.push({"name":"screenE", "width":390, "height":120});
session.screens.push({"name":"screenF", "width":1240, "height":650});// 使用 JSON.stringify 转换为 JSON 字符串
// 然后使用 localStorage 保存在 session 名称里
localStorage.setItem('session', JSON.stringify(session));// 然后是如何转换通过 JSON.stringify 生成的字符串,该字符串以 JSON 格式保存在 localStorage 里
var restoredSession = JSON.parse(localStorage.getItem('session'));// 现在 restoredSession 包含了保存在 localStorage 里的对象
console.log(restoredSession);
规范
规范名称及链接 | 规范状态 |
---|---|
ECMAScript 5.1 (ECMA-262) JSON.stringify |
Standard |
ECMAScript 2015 (6th Edition, ECMA-262) JSON.stringify |
Standard |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | 3.5 (1.9.1) | 8.0 | 10.5 | 4.0 |
Using native JSON
本文介绍了兼容ECMAScript 5 标准的原生JSON对象. 在不支持原生JSON对象的旧版本Firefox中,该如何处理JSON数据.请查看 JSON.
原生JSON对象包含有两个关键方法.JSON.parse()方法用来解析
JSON字符串,并且重构为JavaScript对象,而JSON.stringify()方法可以将javascript对象转换为等价的JSON字符串.
解析JSON字符串
将JSON字符串解析成为一个JavaScript对象,你只需要将JSON字符串作为参数传递给JSON.parse()
方法,如下:
var jsObject = JSON.parse(jsonString);
引入于 JavaScript 1.8.5 (Firefox 4), JSON.parse()
不允许最后一个键值对后面存在逗号
// JavaScript 1.8.5中,下述两行代码都会抛出SyntaxError异常
var jsObject = JSON.parse("[1, 2, 3, 4, ]");
var jsObject = JSON.parse("{ \"foo\" : 1, }");
将对象转为JSON
将一个JavaScript对象字符串化为JSON,你只需要将该对象作为参数传递给JSON.stringify(
)
方法,如下:
var foo = {};
foo.bar = "new property";
foo.baz = 3;var jsonString = JSON.stringify(foo);
jsonString
的新值为'{"bar":"new property","baz":3}'
.
从Firefox 3.5.4起, JSON.stringify()
提供一个可选参数来提供额外的自定义转换方法的能力.如下:
jsonString = JSON.stringify(value [, replacer [, space]])
value
- 将要转为JSON字符串的javascript对象.
replacer
- 该参数可以是多种类型,如果是一个函数,则它可以改变一个javascript对象在字符串化过程中的行为, 如果是一个包含
String
和Number
对象的数组,则它将作为一个白名单.只有那些键存在域该白名单中的键值对才会被包含进最终生成的JSON字符串中.如果该参数值为null或者被省略,则所有的键值对都会被包含进最终生成的JSON字符串中. space
- 该参数可以是一个
String
或Number
对象,作用是为了在输出的JSON字符串中插入空白符来增强可读性. 如果是Number
对象, 则表示用多少个空格来作为空白符; 最大可为10,大于10的数值也取10.最小可为1,小于1的数值无效,则不会显示空白符. 如果是个String对象
, 则该字符串本身会作为空白符,字符串最长可为10个字符.超过的话会截取前十个字符. 如果该参数被省略 (或者为null), 则不会显示空白符.
replacer 参数
replacer
参数可以是一个函数或者是一个数组.如果是函数, 则该函数会被传入两个参数, 分别是当前正在被字符串化的键值对的键和值. 初始化时,一个默认的键值对(键为空,值为要JSON化的对象)会传入这个函数, 然后,要JSON化的对象或者数组的每个键值对也会一级一级被传入这个函数. 该函数的返回值会影响正在被字符串化的键值对会不会被加入最终生成的JSON字符串中化,如下:
- 如果返回一个
Number
类型的值, 则该数字会通过toString方法转换成字符串,来作为正在被字符串化的键值对中的值被添加到JSON字符串中. - 如果返回一个
String
类型的值, 则该字符串会作为正在被字符串化的键值对中的值被添加到JSON字符串中. - 如果返回一个
Boolean
类型的值, 则该布尔值会转化成字符串"true"或"false" ,来作为正在被字符串化的键值对中的值被添加到JSON字符串中. - 如果返回一个其他类型的对象, 则该对象的键值对会被递归的按照上述的规则添加到JSON字符串中, 但如果该对象是function类型的, 则它不会变遍历.
replacer函数会
转而处理下一个键值对. - 如果返回
undefined
, 则该键值对不会被添加到JSON字符串中.
replacer
函数剔除数组中的某些值.例子
function censor(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, censor);
jsonString
的新值为{"week":45,"month":7}
.
如果 replacer
是一个数组, 则源对象中,只有键存在replacer
数组中的键值对,才会被包含进最终的JSON字符串中.
未经允许不得转载:Bcoder资源网 » JSON.stringify()文档
评论前必须登录!
登陆 注册