4

有人能解释一下 JSON.stringify() 如何神奇地只将 JSON 字符串化为通过 URL 获取的,并且不打扰完整集合对象的其他特定于主干的部分吗?

我对解释这种令人印象深刻的功能的底层实现和/或设计模式感到好奇。我不得不使用 json2.js 来获得 stringify 功能,所以我认为骨干网不会覆盖或装饰 stringify。

我发现如果我将集合直接传递给 JS OBJECT 代码,代码“看到”集合对象的模型键和其他特定于主干的部分,而如果我在该字符串化对象上执行 JSON.stringify THEN jquery.parseJSON,我的代码“看到”仅由 URL 返回的 JSON。

代码:

enter code here

$(function () {
    var Person = Backbone.Model.extend({
        initialize: function () {
            // alert("Model Init");
        }
    }),
    PersonList = Backbone.Collection.extend({
        model: Person,
        url: '/Tfount_Email/Email/SOAInbox',
        initialize: function () {
            // alert("Collections Init");
        }
    }),
    personlist = new PersonList();

    personlist.fetch({
        error: function () {
            alert("Error fetching data");
        },
        success: function () {
            // alert("no error");
        }
    }).complete(function () {

    // first call to makeTable w collection obj, we see MORE than just the JSON returned by URL
        makeTable(personlist);      

    // stringify then parse, we see only JSON returned by URL
        jsonString = JSON.stringify(personlist);
        var plistJSON = jQuery.parseJSON(jsonString);
        makeTable(plistJSON);
    });
});

function makeTable(obj) {

    var type = typeof obj
    if (type == "object") {
        for (var key in obj) {
            alert("key: " + key)
            makeTable(obj[key])
        }
    } else {
        alert(obj)
    }

}
4

1 回答 1

11

这是JSON.Stringify. 来自 Douglas Crockford 的 JSON2.js 文件:

当找到一个对象值时,如果该对象包含一个 toJSON 方法,就会调用它的 toJSON 方法并将结果字符串化。

https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L38-39

当您在 Backbone.Collection 上调用 JSON.stringify 时,它会调用该集合的toJSON方法,如本注释所述。

于 2012-08-19T00:23:03.323 回答