JS高程3:JSON

JSON,JavaScript Object Notation,JS对象表示法,是目前最常见的结构化数据传输形式。

JSON并非编程语言,而是一种数据结构,像mp4、avi一样,只是一种数据格式而已。(数据结构可以包含很多数据类型)

JSON值的类型

  • 简单值
  • 对象
  • 数组

简单值:字符串、数字、布尔值和null,注意不包括undefined。

注意:JSON中的字符串必须用双引号。

对象:对象就是无序的键值对,而键值中的值也可以是简单值、对象或者数组。

注意:JSON中对象的属性必须用双引号括起来,JSON中没有变量的概念。

数组:有序的值的列表,而值本身可以是简单值、对象或者数组。

解析与序列化

JS中有个全局对象JSON,该对象有stringify()和parse()方法,分别用来序列化JS和解析JSON。

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj);
console.log(j1);
var j2 = JSON.parse(j1);
console.log(j2)

注意:因为JSON中没有undefined数据类型,所以该键值会被忽略。

{"name":"leo","age":19,"marry":false,"none":null}
{name: "leo", age: 19, marry: false, none: null}

序列化选项

JSON.stringify()函数还可以接收第二个和第三个参数,用来实现更为丰富的功能。

过滤

第二个参数可以是一个数组,数组包含对象属性的字符串形式:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj,["name","age",]);
console.log(j1); //{"name":"leo","age":19}

如果参数是函数:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj,function(key,value){
		switch(key){
			case "age":
				return 20;
			case "none":
				return "没有";
			case "marry":
				return "false";
			default:
				return value;
		}
});
console.log(j1); //{"name":"leo","age":20,"marry":"false","none":"没有"}

缩进

如果想缩进4空格:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj,null,4);
console.log(j1);
{
    "name": "leo",
    "age": 19,
    "marry": false,
    "none": null
}

注意:最大缩进为10格。

特殊字符:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj,null,"-->");
console.log(j1);
{
-->"name": "leo",
-->"age": 19,
-->"marry": false,
-->"none": null
}

使用toJSON:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
	toJSON: function(){
		return this.name;
	}
};
var j1 = JSON.stringify(obj);
console.log(j1); //"leo"

序列化该对象的顺序如下

(1) 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
(2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
(3) 对第(2)步返回的每个值进行相应的序列化。
(4) 如果提供了第三个参数,执行相应的格式化。

解析选项

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用 。

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
	releaseDate: new Date(2011, 11, 1),
};
var j1 = JSON.stringify(obj);
console.log(j1);
var j2 = JSON.parse(j1,function(key,value){
	if (key == "releaseDate"){
		return new Date(value);
	} else {
		return value;
}
});
console.log(j2);
console.log(j2.releaseDate.getFullYear());
{"name":"leo","age":19,"marry":false,"none":null,"releaseDate":"2011-11-30T16:00:00.000Z"}
{name: "leo", age: 19, marry: false, none: null, releaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间)}age: 19marry: falsename: "leo"none: nullreleaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间) {}__proto__: Object
2011

还原函数在遇到"releaseDate"键时,会基于相应的值创建一个新的 Date 对象。结果就是
bookCopy.releaseDate 属性中会保存一个 Date 对象。正因为如此,才能基于这个对象调用
getFullYear()方法。

时间: 2024-12-26 16:21:00

JS高程3:JSON的相关文章

用js解析经json序列化后的C#的DateTime类型数据

用js解析经json序列化后的C#的DateTime类型数据 (2012-09-21 19:36:03) 转载▼ 标签: 杂谈 分类: javascript // val为经json直接序列化后的C#的DateTime类型的数据function formatTime(val) {    var re = /-?\d+/;    var m = re.exec(val);    var d = new Date(parseInt(m[0]));// 按[2012-02-13 09:09:09]的格

JSON(二)——JavaScript中js对象与JSON格式字符串的相互转换

首先我们来看一下js中JSON格式的字符串 var JSONStr1 = "{\"name\" : \"张三\"}"; 注意以下的写法不是js中JSON格式的字符串,它只是一个js的字符串. var JSONStr2 = "{'name' : '张三'}"; 我们看JSON语法中对于字符串的定义:是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义.一个字符(character)即一个单独的字符串(characte

JS 循环遍历JSON数据 分类: JS技术 JS JQuery 2010-12-01 13:56 43646人阅读 评论(5) 收藏 举报 jsonc JSON数据如:{"options":"[{

JS 循环遍历JSON数据 分类: JS技术 JS JQuery2010-12-01 13:56 43646人阅读 评论(5) 收藏 举报 jsonc JSON数据如:{"options":"[{/"text/":/"王家湾/",/"value/":/"9/"},{/"text/":/"李家湾/",/"valu e/":/"10

《JS高程》事件学习笔记

事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. ------------------------------------------------------------------------------------------------------------- 一.事件流 事件流:描述的是页面中接收事件的顺序. IE:事件冒泡流,即事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档): NetScape:事件捕获流,即不太具体的节

在js中 把 json对象转化为String对象的方法

方法1: 使用js的扩展方法 ** * json对象转字符串形式 */ function json2str(o) { var arr = []; var fmt = function(s) { if (typeof s == 'object' && s != null) return json2str(s); return /^(string|number)$/.test(typeof s) ? "'" + s + "'" : s; } for (v

JS学习笔记-JSON

JSON(JavaScriptObject Notation)-JS对象表示法,是JavaScript的一个严格子集,它是一种开发式和基于文本的数据交换格式,因此JSON并不是JS独有,其他很多语言也可以对JSON进行解析和序列化. 特点: 1.轻量级-易于阅读和编写,同时易于及其解析和生成 2.可表示类型: (1)简单值:字符串.数值.布尔值.null,不支持特殊值JS中的undefined (2)对象 { "user" : "Admin", "age&

js怎么解析json格式字符串

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <SCRIPT LANGUAGE="JavaScript"> var t="{'firstName': 'cyra', 'lastName': 'richardson', '

JS中:json对象数组按对象属性排序

var array = [ {name: 'a', phone: 1}, {name: 'b', phone: 5}, {name: 'd', phone: 3}, {name: 'c', phone: 4} ] array.sort(getSortFun('desc', 'phone')); function getSortFun(order, sortBy) { var ordAlpah = (order == 'asc') ? '>' : '<'; var sortFun = new F

JS 动态生成JSON对象

JS 动态生成JSON对象,一般用到JSON传递参数的时候,会用到. function onGeneratedRow(columnsResult) { var jsonData = {}; columnsResult.forEach(function(column) { var columnName = column.metadata.colName; jsonData[columnName] = column.value; }); viewData.employees.push(jsonDat