语法
JSON 字符串必须使用双引号
JSON 中的对象必须给属性加双引号
解析和序列化
解析
JSON.parse(),可接收2个参数:解析的 json 字符串、还原函数
-
还原函数
接收两个参数,一个键和一个值,返回一个值。如果还原函数返回 undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。
var book = { "title": "Professional JavaScript", "authors": [ "Nicholas C. Zakas" ], edition: 3, year: 2011, releaseDate: new Date(2020, 11, 1) }; var jsonText = JSON.stringify(book); var bookCopy = JSON.parse(jsonText, function (key, value) { if (key == "releaseDate") { return new Date(value); } else { return value; } }); alert(bookCopy.releaseDate.getFullYear()); //2020
序列化
JSON.stringify(),可接收3个参数:序列化的js对象、过滤器(可以为数组或者函数)、选项(表示是否在json字符串中保留缩进)
-
过滤结果
如果过滤器是数组,那么 JSON.stringify() 的结果中将只包含数组中列出的属性。
var book = { "title": "Professional JavaScript", "authors": [ "Nicholas C. Zakas" ], edition: 3, year: 2011 }; var jsonText = JSON.stringify(book, ["title", "edition"]); //结果为:{"title":"Professional JavaScript","edition":3}如果过滤器是函数,那么该函数接收两个参数:属性名、属性值,如果函数返回 undefined ,相应的属性会被忽略。
var book = { "title": "Professional JavaScript", "authors": [ "Nicholas C. Zakas" ], edition: 3, year: 2011 }; var jsonText = JSON.stringify(book, function (key, value) { switch (key) { case "authors": return value.join(",") case "year": return 5000; case "edition": return undefined; default: return value; } }); //结果为:{"title":"Professional JavaScript","authors":"Nicholas C. Zakas","year":5000} -
字符串缩进
JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。如果缩进参数是一个字符串,则这个字符串将在 JSON 字符串中被用作缩进字符。缩进空格数和字符串最长都不能超过 10 个字符长,长度超过了 10 ,结果中将空格数为10或者只出现前 10 个字符。
var jsonText1 = JSON.stringify(book, null, 4); var jsonText2 = JSON.stringify(book, null, " - -"); jsonText1为: { "title": "Professional JavaScript", "authors": [ "Nicholas C. Zakas" ], "edition": 3, "year": 2011 } jsonText2为: { --"title": "Professional JavaScript", --"authors": [ ----"Nicholas C. Zakas" --], --"edition": 3, --"year": 2011 } -
toJSON() 方法
可以为任何对象添加toJSON() 方法
var book = { "title": "Professional JavaScript", "authors": [ "Nicholas C. Zakas" ], edition: 3, year: 2011, toJSON: function () { return this.title; } }; var jsonText = JSON.stringify(book);假设把一个对象传入 JSON.stringify(),序列化该对象的顺序如下: (1) 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身 (2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值 (3) 对第(2)步返回的每个值进行相应的序列化 (4) 如果提供了第三个参数,执行相应的格式化