JSON.stringify() 方法

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

语法

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

value
将要序列化成 一个JSON 字符串的值。
replacer 可选
如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化;关于该参数更详细的解释和示例,请参考使用原生的 JSON 对象一文。
space 可选
指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格。
返回值

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

描述

关于序列化,有下面五点注意事项:

非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
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}”

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”;
}
}
);

// undefined

// 不可枚举的属性默认会被忽略:
JSON.stringify(
Object.create(
null,
{
x: { value: ‘x’, enumerable: false },
y: { value: ‘y’, enumerable: true }
}
)
);

// “{“y”:”y”}”
replacer参数

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

如果返回一个 Number, 转换成相应的字符串被添加入JSON字符串。
如果返回一个 String, 该字符串作为属性值被添加入JSON。
如果返回一个 Boolean, “true” 或者 “false”被作为属性值被添加入JSON字符串。
如果返回任何其他对象,该对象递归地序列化成JSON字符串,对每个属性调用replacer方法。除非该对象是一个函数,这种情况将不会被序列化成JSON字符串。
如果返回undefined,该属性值不会在JSON字符串中输出。
注意: 不能用replacer方法,从数组中移除值(values),如若返回undefined或者一个函数,将会被null取代。

例子(function)

function replacer(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, 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)来缩进:

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用作 JavaScript

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

function jsFriendlyJSONStringify (s) {
return JSON.stringify(s).
replace(/\u2028/g, ‘\u2028’).
replace(/\u2029/g, ‘\u2029’);
}

var s = {
a: String.fromCharCode(0x2028),
b: String.fromCharCode(0x2029)
};
try {
eval(‘(’ + JSON.stringify(s) + ‘)’);
} catch (e) {
console.log(e); // “SyntaxError: unterminated string literal”
}

// No need for a catch
eval(‘(’ + jsFriendlyJSONStringify(s) + ‘)’);

// console.log in Firefox unescapes the Unicode if
// logged to console, so we use alert
alert(jsFriendlyJSONStringify(s)); // {“a”:”\u2028”,”b”:”\u2029”}
使用 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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

师--链表的结点插入

Problem Description 给出一个只有头指针的链表和 n 次操作,每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。Input 多组输入。每组数据首先输入一个整数n(n∈[1,100]),代表有n次操作。接下来的n行&…

BeanUtils工具的使用(转载)

原文章地址:https://www.cnblogs.com/vmax-tam/p/4159985.html BeanUtils工具 什么是BeanUtils工具 BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品。 BeanUtils工具一般可以方便javaBean的哪些操作? 1&…

线程可警告状态以及APC队列

转自:http://blog.csdn.net/qq_22423659/article/details/53425828 一、线程可警告状态的真实含义 1、通过另一些方法让线程"暂停"(非SuspendThread方法,比如SleepEx,wait函数族等),并可以进入一种称之为 Alterable的状…

数据结构实验之链表三:链表的逆置

Problem Description 输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据。Input 输入多个整数,以-1作为结束标志。Output 输出逆置后的单链表数据。…

DBUtils使用详细示例(转载)

https://www.cnblogs.com/smyhvae/p/4085684.html

APC异步过程调用

转自:http://blog.sina.com.cn/s/blog_c2ef450f010192hx.html APC 异步过程调用 记得第一次看见这个名词的时候,觉得云里雾罩,然而上网看了下它的介绍,感觉说的都是没头没脑的 然而今天,我再次接触了它,我将…

张小龙:如何把产品做简单

今天从一个小故事开始讲:为什么苹果的手机只有一个按钮? (台下:我觉得对于用户来说,只有一个按钮不会有太多的干扰,只要从这里开始,其它的菜单都在这里面了,这是我个人的一些想法。&…

数据结构实验之链表九:双向链表

Problem Description 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内存中找到下一个位置,这是一个不会轻易断裂的链。但单链表有一个弱点——不能回指。比如在链表中有两个节点A,B,他们的关系是B是A的后…

不敢死队问题

Problem Description 说到“敢死队”,大家不要以为我来介绍电影了,因为数据结构里真有这么道程序设计题目,原题如下: 有M个敢死队员要炸掉敌人的一个碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战…

槽边往事

http://chuansong.me/account/bitsea?start12

数据结构实验之链表五:单链表的拆分

Problem Description 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。Input 第一行输入整数N;; 第二行依次输…

聊天机器人调用API实现

后端调用API: package com.mychat.servlet;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder;…

Dump文件

1. Dump文件 1. Dump文件介绍 Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀。dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件。dump文件根据存储时的选项不同,会生成不同大小的文件,其中…

整理音乐

Problem Description 请用链表完成下面题目要求。 xiaobai 很喜欢音乐,几年来一直在收集好听的专辑。他有个习惯,每次在听完一首音乐后会给这首音乐打分,而且会隔一段时间给打好分的音乐排一个名次。今天 xiaobai 打开自己的音乐文件夹&#…

VS2013正在等待所需操作完成

在用VS2013打开解决方案的时候,遇到”正在等待所需操作完成 ,此对话框将在操作完成后关闭“一直弹出显示,解决方案无法加载的情况!此时需要将与解决方案名字相同的文件全部相同(除解决方案文件除外)全部删除…

web聊天室实现

后端: package com.jsx.chat;import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.OnClose; imp…

QPSQL driver not loaded

在用qt连接postgreSQL数据库时,出现驱动无法加载的情况,如下图: 代码:mPgDataBase QSqlDatabase::addDatabase("QPSQL"); 如下如下错误: 解决方案: 网上下载”libpq.dll文件“拷贝至运行文件…

一对一聊天ajax实现

前端页面&#xff1a; 好友列表&#xff1a; 好友列表代码&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <% page import"java.util.Random" %> <% taglib ur…