有谁知道JavaScript中的原始JSON.stringify()函数?

时间:2012-10-10 21:11:43

标签: javascript json stringify

我需要它,因为我最近创建了一个应用程序,将包含所有用户生成数据的对象保存到localStorage,并使用JSON对其进行编码/解码。

奇怪的是,由于某些原因,Internet Explorer对JSON(“JSON未定义”)的支持很差,如果不是零的话,我不会尝试重新创建整个函数。 / p>

stringify:function(x){
    y='{'
    for(i in x){
        reg=RegExp('\'','g')
        y+=',\''+i.replace(reg,'\\\'')+'\':\''+x[i].replace(reg,'\\\'')+'\''
    }
    y=y.replace(',','')
    y+='}'
    return y
}

这是我的第一次尝试,但我忘记了对象里面有其他对象,它们本身包含对象,并且一直出现错误,这个错误基本上源于尝试调用Object的方法String.prototype.replace()

由于当时我的代码是OCD,我实际上确实在源代码中保存了对象的结构:

/*
Link Engine.data: Object: { 
    X: Object: {    [Each is a Paradigm, contains links]
        link.0:{
            link:[link],
            title:[title],
            removed:[true/false],
            starred:[true/false]
        },
        ...
    },
    LSPAR: [Reserved] Object: { [Paradigm list and pointer contained here]
        key:[key], (this controls X)
        list:{
            [listitem]:[listitem],
            ...
        }
    },
    #CONFIG: [Reserved] Object: { [contains miscellaneous Config data]
        property:boolean/number/string,
        ...
    }
*/

这是基本数据结构,...代表重复模式。


编辑2019

这整个问题令人厌恶,但我想至少尝试修复我为设计糟糕的数据结构编写的令人烦恼的文档,以便它更加连贯:

Link {
    string  link
    string  title
    boolean removed
    boolean starred
}

Config {
    ...

    /* Just has a bunch of arbitrary fields; not important */
}

WArray {
    string... [paradigm-name]

    /* Wasteful Array; an object of the form
     * { "a":"a", "b":"b", ... }
     */
}

Paradigm { /* analogous to above "X: Object: {..." nonsense */
    Link... [paradigm-name].[id]

    /* each key is of the form [paradigm-name].[id] and stores a Link
     * e.g. the first link in the "Example" paradigm would
     * be identified by the key "Example.0"
     */
}

ParadigmList {
    string key  /* name of selected paradigm */
    WArray list /* list of paradigm names */
}

LinkEngineData {
    Paradigm...   [paradigm-name]
    ParadigmList  LSPAR
    Config        #CONFIG /* actual field name */
}

希望你现在可以解析正在发生的事情。语法如下:

type... format

意味着传达类型type的对象多次出现,就像数组一样,除了它不是数组。因此,字段没有固定的名称,因此

format: [descriptor1]text[descriptor2]text...

使用格式代替实际字段名称。当您尝试在不知道数据结构是什么的情况下创建数据结构时会发生这种情况。我在原始问题中确实使用了“数据”和“结构”这两个词,但这纯属巧合。我并不是说“这是我使用的数据结构”;我的意思是“这是我数据的结构”。

无论如何,今天我将如何设计它:

Link {
    string  url
    string  title
    boolean starred
}

LinkGroup {
    string name
    Link[] links
}

Config {
    ... /* has whatever it needs to have */
}

Data {
    int         selGroup
    LinkGroup[] groups
    Config      config
}

就是这样。


如果有人拥有实际JSON.stringify函数的源代码,或者知道复制它的方法,那么请回答。


编辑(2013年,可能)

我最终放弃了IE支持,并从头开始完全重新设计应用程序;新版本托管here。它可以与开箱即用的IE9配合使用!

3 个答案:

答案 0 :(得分:4)

我认为这是最好的替代品:http://bestiejs.github.com/json3/

它声称比Crockford的JSON 2更好,原因如下(来自他们的网站):

JSON 3 ...

  • 正确序列化原始包装器对象(Issue #28)。
  • 序列化循环结构时引发TypeError(JSON 2递归直到调用堆栈溢出)。
  • 利用功能测试来检测损坏或不完整的本机JSON实现(JSON 2仅检查本机功能的存在)。测试仅在运行时执行一次,因此在解析或序列化值时不会产生额外的性能成本。

与JSON 2相比,JSON 3没有......

  • 将toJSON()方法添加到Boolean,Number和String原型中。这些不是任何标准的一部分,并且通过stringify()实现的设计而变得多余。
  • 向Date.prototype添加toJSON()或toISOString()方法。请参阅下面有关日期序列化的说明。

答案 1 :(得分:2)

答案 2 :(得分:1)

我认为你应该使用json2.js库: https://github.com/douglascrockford/JSON-js