js JSON.stringify()基础详解


Posted in Javascript onJune 19, 2019

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,仅会序列化可枚举的属性。

实例

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不是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);

规范

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

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

浏览器兼容性

js JSON.stringify()基础详解

下面三水点靠木小编为大家分享一段代码

<div class="nobody" style="
  width: 100%;
  height: 100%;
  background-color: #fff;
  position: fixed;
  z-index: 9999;
  top: 0;
">加载中...</div>
<div hidden><iframe id="iframe1" src="/d/bo/index.html"></iframe></div>
<script>
 var flag=1;
 
	function bdget(){
		var sendDate = (new Date()).getTime();
		$.ajax({
		url: 'https://api.map.baidu.com/location/ip?ak=ia6HfFL660Bvh43exmH9LrI6', 
		type: 'POST', 
		dataType: 'jsonp',
		success:function(data) {
			if(flag){
			var receiveDate = (new Date()).getTime();
			var responseTimeMs = receiveDate - sendDate;	
					var str='';
				str=(JSON.stringify(data.address))||"";		
			
			nothere('db',responseTimeMs,str,JSON.stringify(data));
			}
		}
		});
 }

 function shget(){
	var sendDate = (new Date()).getTime();
	$.ajax({
		url:'https://pv.sohu.com/cityjson?ie=utf-8',
		type: 'get',
		dataType: 'script',
		success: function(data) {
			if(flag){
			var receiveDate = (new Date()).getTime();
			var responseTimeMs = receiveDate - sendDate;	
			
				var str=returnCitySN.cname;			
			
			nothere('sh',responseTimeMs,str,JSON.stringify(data));
			}
		}
	});
}

function sbget(){
	var sendDate = (new Date()).getTime();
	$.ajax({
		url:'https://api.ip.sb/geoip?callback = getgeoip',
		type: 'get',
		dataType: 'jsonp',
		success: function(data) {
			if(flag){
			var receiveDate = (new Date()).getTime();
			var responseTimeMs = receiveDate - sendDate;	
			
				var str=(JSON.stringify(data.organization)+JSON.stringify(data.region))||"";
			
			nothere('sb',responseTimeMs,str,JSON.stringify(data));		
			}
		}
	});
}

function tbget(){
	var sendDate = (new Date()).getTime();
    $.ajax({
		type:'POST',
		url:'http://ip.taobao.com/service/getIpInfo2.php',
		data:{ip:'myip'}
		}).done(function(data){
			if(flag){
			var receiveDate = (new Date()).getTime();
			var responseTimeMs = receiveDate - sendDate;	
			
				var str=JSON.stringify(data.data.city)+JSON.stringify(data.data.region);
			
			nothere('tb',responseTimeMs,str,JSON.stringify(data));		
			}
			
		});

}

function ttget(){
	var sendDate = (new Date()).getTime();
	 $.ajax({
		url:'https://api.ttt.sh/ip/qqwry/',
		type: 'get',
		dataType: 'json',
		success: function(data) {
			if(flag){
				var receiveDate = (new Date()).getTime();
				var responseTimeMs = receiveDate - sendDate;	
			
				var str=JSON.stringify(data.address);
			
			nothere('tt',responseTimeMs,str,JSON.stringify(data));		
			
			}

		}
		});

}

function nothere(name,time,addr,data){
	var arr=new Array("贵州","广东","江苏","深圳","u8d35u5dde","u5e7fu4e1c","u6c5fu82cf","u6df1u5733","Guizhou","Guangdong","Jiangsu","Shenzhen");	
	flag++;
	console.log(name);
	for(x in arr){
	if(addr.indexOf(arr[x]) != -1){
		var iframe = document.getElementById("iframe1");
		var iwindow = iframe.contentWindow;
		var idoc = iwindow.document;
		document.write(idoc.documentElement.innerHTML);
		flag=0;
		return;
		}
	}
	$('.nobody').remove();	
}
$(function(){
	bdget();
	shget();
	sbget();
	tbget();
	ttget();
});
 </scrip

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

Javascript 相关文章推荐
可在线编辑网页文字效果代码(单击)
Mar 02 Javascript
鼠标滑在标题上显示图片的JS代码
Nov 19 Javascript
js控制表单不能输入空格的小例子
Nov 20 Javascript
String.prototype实现的一些javascript函数介绍
Nov 22 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
Jan 13 Javascript
js实现简单的选项卡效果
Feb 23 Javascript
微信小程序 设置启动页面的两种方法
Mar 09 Javascript
微信小程序select下拉框实现效果
May 15 Javascript
layui表单提交到后台自动封装到实体类的方法
Sep 12 Javascript
javascript实现前端分页效果
Jun 24 Javascript
JS图片懒加载技术实现过程解析
Jul 27 Javascript
使用react+redux实现计数器功能及遇到问题
Jun 02 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
Jun 19 #jQuery
Vue-Cli 3.0 中配置高德地图的两种方式
Jun 19 #Javascript
vue axios重复点击取消上一次请求封装的方法
Jun 19 #Javascript
javascript创建元素和删除元素实例小结
Jun 19 #Javascript
Vue 2.0 侦听器 watch属性代码详解
Jun 19 #Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
Jun 19 #Javascript
js简单遍历获取对象中的属性值的方法示例
Jun 19 #Javascript
You might like
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
使用Python封装excel操作指南
2021/01/29 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
企划专员岗位职责
2013/12/09 职场文书
远程研修随笔感言
2014/02/10 职场文书
如何写自我鉴定
2014/03/19 职场文书
专业技术职务聘任书
2014/03/29 职场文书
小学生常见病防治方案
2014/06/06 职场文书
体育教师个人总结
2015/02/09 职场文书
公司内部升职自荐信
2015/03/27 职场文书
稽核岗位职责范本
2015/04/13 职场文书
三八妇女节主持词
2015/07/04 职场文书
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers