[code]{ "title": "aaa", "authors": [ "aa", "bb" ], "edition": 3, "year": 2011 }可以注意到,这个方法也在结果字符串中插入了换行符以提高可读性。只要传入有效的控制缩进的参数值,结果字符串就会包含换行符。
最大缩进空格数为10,所有大于10的值都会自动转换为10.
如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符。在使用字符串的情况下,可以将缩进字符设置为制表符,或者两个短划线之类的任意字符。
[code]var jsonText = JSON.stringify(book,null,"--");[code]{ --"title": "aaa", --"authors": [ ----"aa", ----"bb" --], --"edition": 3, --"year": 2011 }
缩进字符串最长不能超过10个字符长。如果字符串长度超过了10个,结果中将只出现前10个字符。
toJSON()方法有时候,JSON.stringify()方法还不能满足对某些对象进行自定义序列化的需求。这种情况下,可以给对象定义toJSON()方法,返回其自身的JSON数据格式。可以为任何对象添加toJSON()方法。
[code]var book = { "title":"aaa", "authors":[ "aa", "bb" ], "edition":3, "year":2011, toJSON:function(){ return this.title; } }; var jsonText = JSON.stringify(book); //"aaa"以上代码在book对象上定义了一个toJSON方法,该方法返回title的值。
可以让toJSON()方法返回任何值,他都能正常工作。
比如,在这个方法上返回undefined,此时如果包含它的对象嵌入在另一个对象中,会导致它的值变为null;而如果它是顶级对象,结果就是undefined。
toJSON()可以作为函数过滤器的补充,因此理解过滤器序列化的内部顺序十分重要。假设把一个对象传入JSON.stringify(),序列化该对象的顺序如下:
如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法,否则返回对象本身。
如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是上一步的结果。
对上一步返回的每个值进行相应的序列化。
如果提供了第三个参数,执行相应的格式化。
解析选项JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。 为了区别JSON.stringify()接收的过滤函数,这个函数被称为还原函数,但实际上这两个函数的签名是相同的,它们都接收两个参数,一个键和一个值,而且都要返回一个值。
如果还原函数返回undefined,则表示要从结果中删除相应的键;
如果返回其他值,则将该值插入到结果中。
[code]var book = { "title":"aaa", "authors":[ "aa", "bb" ], "edition":3, "year":2011, "releaseDate":new Date(2011,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());以上代码先是为book增加了一个releaseDate属性,该属性保存着一个Date对象。这个对象在序列化之后变成了有效的字符串,然后经过解析又在bookCopy中还原为一个Date对象。(还原函数在遇到“releaseDate”键时,会基于相应的值创建一个新的Date对象。)
js
猜你在找