toJSON()与stringify()过滤函数的理解


写在开头的对json的一些理解

因为在操作和读取数据的时候使用json会非常方便,所以json被运用的越来越普遍,尤其在ajax中经常用json结构化数据。之前关于json的理解一直很模糊,感觉云里雾里,所以今天又重新阅读了红宝书中对json的介绍。

关于json一定要明白的是它不是一个编程语音,而是一种数据格式,虽然具有相同的语法格式,但并不是只有javascript使用JSON,也不属于任何一种编程语言,但json也是JavaScript的子集。json字符串本质其实是字符串,但它的格式和js对象字面量十分相似,但不一样(多了引号)。

关于json对象和json字符串

JSON对象是直接可以使用JQuery或者JS操作的格式,如Java中可以用对象(类名)点出属性(方法)一样

JSON字符串仅仅只是一个字符串,一个整体,不截取的话没办法取出其中存储的数据,不能直接使用。

toJSON和stringify()过滤函数的区别

这里只是讲述在json对象格式化(序列化)的一些区别,而解析json字符串是eval()和parse()方法。

其实我看到toJSON无非就是在声明json对象的时候加了一个tojson属性,然后是个函数,可以通过调用它取得一个有效值。这stringify()的过滤函数不就能做吗,有什么区别吗~但后来发现还是有的...

他和 stringify 方法第二个参数稍微有点不同。因为 stringify 第二个参数是回调函数时,只是对当前 key 对应的值进行修改。

 toJSON 则是对当前对象进行修改。

例如:

var obj = { key: 'foo' };

var ret = JSON.stringify(obj, function (k, v) {

                               return k === "key" ? v.toUpperCase() : v; });

console.log(ret);

var obj = { key: 'foo',

         toJSON: function () {

         return 'bar';

} };

var ret = JSON.stringify(obj);

console.log(ret);

区别非常明显,toJSON 的返回值直接代替了当前对象,而 stringify 的回调函数则仅仅是修改了当前值。

原理:

toJSON()作为JSON.stringify中第二个参数(函数过滤器)补充,理解内部顺序很重要。

 把对象传入JSON.stringify() 序列化对象的顺序如下:

      (1)如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,按默认顺序执行序列化

      (2)如果提供了第二个参数,应用这个函数过滤器,传入的函数过滤器的值是第(1)步返回的值。

      (3)对第(2)步 返回的每个值进行相应的序列化。

      (4)如果提供了第三个参数,执行相应的格式化操作。

注:刚刚学习,见解浅薄,如有错误欢迎大家指正

你可能感兴趣的:(toJSON()与stringify()过滤函数的理解)