经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JSON » 查看文章
js JSON.stringify()基础详解
来源:jb51  时间:2019/6/20 10:14:46  对本文有异议

JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,如果指定了replacer是一个函数,则可以选择性的替换值,或者如果指定了replacer是一个数组,可选择性的仅包含数组指定的属性。

语法

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

参数

value

将要序列化成 一个JSON 字符串的值。

replacer 可选

如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化;关于该参数更详细的解释和示例,请参考使用原生的 JSON 对象一文。

space 可选

指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格。
返回值

一个表示给定值的JSON字符串。

描述
JSON.stringify()将值转换为相应的JSON格式:

  • 转换值如果有toJSON()方法,该方法定义什么值将被序列化。
  • 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
  • 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
  • undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。函数、undefined被单独转换时,会返回undefined,如JSON.stringify(function(){}) or JSON.stringify(undefined).
  • 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。
  • 所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。
  • Date日期调用了toJSON()将其转换为了string字符串(同Date.toISOString()),因此会被当做字符串处理。
  • NaN和Infinity格式的数值及null都会被当做null。
  • 其他类型的对象,包括Map/Set/weakMap/weakSet,仅会序列化可枚举的属性。

实例

  1. JSON.stringify({}); // '{}'
  2. JSON.stringify(true); // 'true'
  3. JSON.stringify("foo"); // '"foo"'
  4. JSON.stringify([1, "false", false]); // '[1,"false",false]'
  5. JSON.stringify({ x: 5 }); // '{"x":5}'
  6.  
  7. JSON.stringify({x: 5, y: 6});
  8. // "{"x":5,"y":6}"
  9.  
  10. JSON.stringify([new Number(1), new String("false"), new Boolean(false)]);
  11. // '[1,"false",false]'
  12.  
  13. JSON.stringify({x: undefined, y: Object, z: Symbol("")});
  14. // '{}'
  15.  
  16. JSON.stringify([undefined, Object, Symbol("")]);
  17. // '[null,null,null]'
  18.  
  19. JSON.stringify({[Symbol("foo")]: "foo"});
  20. // '{}'
  21.  
  22. JSON.stringify({[Symbol.for("foo")]: "foo"}, [Symbol.for("foo")]);
  23. // '{}'
  24.  
  25. JSON.stringify(
  26. {[Symbol.for("foo")]: "foo"},
  27. function (k, v) {
  28. if (typeof k === "symbol"){
  29. return "a symbol";
  30. }
  31. }
  32. );
  33.  
  34.  
  35. // undefined
  36.  
  37. // 不可枚举的属性默认会被忽略:
  38. JSON.stringify(
  39. Object.create(
  40. null,
  41. {
  42. x: { value: 'x', enumerable: false },
  43. y: { value: 'y', enumerable: true }
  44. }
  45. )
  46. );
  47.  
  48. // "{"y":"y"}"

replacer参数
replacer参数可以是一个函数或者一个数组。作为函数,它有两个参数,键(key)值(value)都会被序列化。

  • 如果返回一个 Number, 转换成相应的字符串被添加入JSON字符串。
  • 如果返回一个 String, 该字符串作为属性值被添加入JSON。
  • 如果返回一个 Boolean, "true" 或者 "false"被作为属性值被添加入JSON字符串。
  • 如果返回任何其他对象,该对象递归地序列化成JSON字符串,对每个属性调用replacer方法。除非该对象是一个函数,这种情况将不会被序列化成JSON字符串。
  • 如果返回undefined,该属性值不会在JSON字符串中输出。

注意: 不能用replacer方法,从数组中移除值(values),如若返回undefined或者一个函数,将会被null取代。

例子(function)

  1. function replacer(key, value) {
  2. if (typeof value === "string") {
  3. return undefined;
  4. }
  5. return value;
  6. }
  7.  
  8. var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
  9. var jsonString = JSON.stringify(foo, replacer);

JSON序列化结果为 {"week":45,"month":7}.

例子(array)
如果replacer是一个数组,数组的值代表将被序列化成JSON字符串的属性名。

JSON.stringify(foo, ['week', 'month']);
// '{"week":45,"month":7}', 只保留“week”和“month”属性值。

space 参数
space 参数用来控制结果字符串里面的间距。如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);如果是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符)。

JSON.stringify({ a: 2 }, null, " "); // '{\n "a": 2\n}'

使用制表符(\t)来缩进:

  1. JSON.stringify({ uno: 1, dos : 2 }, null, '\t')
  2. // '{ // "uno": 1, // "dos": 2 // }'

toJSON 方法

如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用 toJSON 方法后的返回值会被序列化,例如:

  1. var obj = {
  2. foo: 'foo',
  3. toJSON: function () {
  4. return 'bar';
  5. }
  6. };
  7. JSON.stringify(obj); // '"bar"'
  8. JSON.stringify({x: obj}); // '{"x":"bar"}'

注意JSON不是javascript严格意义上的子集,在JSON中不需要省略两条终线(Line separator和Paragraph separator)但在JavaScript中需要被省略。因此,如果JSON被用作JSONP时,下面方法可以使用:

  1. function jsFriendlyJSONStringify (s) {
  2. return JSON.stringify(s).
  3. replace(/\u2028/g, '\\u2028').
  4. replace(/\u2029/g, '\\u2029');
  5. }
  6.  
  7. var s = {
  8. a: String.fromCharCode(0x2028),
  9. b: String.fromCharCode(0x2029)
  10. };
  11. try {
  12. eval('(' + JSON.stringify(s) + ')');
  13. } catch (e) {
  14. console.log(e); // "SyntaxError: unterminated string literal"
  15. }
  16.  
  17. // No need for a catch
  18. eval('(' + jsFriendlyJSONStringify(s) + ')');
  19.  
  20. // console.log in Firefox unescapes the Unicode if
  21. // logged to console, so we use alert
  22. alert(jsFriendlyJSONStringify(s)); // {"a":"\u2028","b":"\u2029"}

使用 JSON.stringify 结合 localStorage 的例子
一些时候,你想存储用户创建的一个对象,并且,即使在浏览器被关闭后仍能恢复该对象。下面的例子是 JSON.stringify 适用于这种情形的一个样板:

  1. // 创建一个示例数据
  2. var session = {
  3. 'screens' : [],
  4. 'state' : true
  5. };
  6. session.screens.push({"name":"screenA", "width":450, "height":250});
  7. session.screens.push({"name":"screenB", "width":650, "height":350});
  8. session.screens.push({"name":"screenC", "width":750, "height":120});
  9. session.screens.push({"name":"screenD", "width":250, "height":60});
  10. session.screens.push({"name":"screenE", "width":390, "height":120});
  11. session.screens.push({"name":"screenF", "width":1240, "height":650});
  12.  
  13. // 使用 JSON.stringify 转换为 JSON 字符串
  14. // 然后使用 localStorage 保存在 session 名称里
  15. localStorage.setItem('session', JSON.stringify(session));
  16.  
  17. // 然后是如何转换通过 JSON.stringify 生成的字符串,该字符串以 JSON 格式保存在 localStorage 里
  18. var restoredSession = JSON.parse(localStorage.getItem('session'));
  19.  
  20. // 现在 restoredSession 包含了保存在 localStorage 里的对象
  21. console.log(restoredSession);

规范

规范名称及链接 规范状态
ECMAScript 5.1 (ECMA-262) JSON.stringify

ECMAScript 2015 (6th Edition, ECMA-262)JSON.stringify

浏览器兼容性

这篇文章就介绍到这了,想更多的了解JSON stringify的知识可以查看以下相关文章。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号