2

我需要它,因为我最近制作了一个应用程序,该应用程序将包含所有用户生成数据的对象保存到localStorage,并使用JSON.

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

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
}

这是我的第一次尝试,但我忘记了该对象内部还有其他对象,这些对象本身包含对象,并且不断收到错误,该错误基本上源于尝试调用String.prototype.replace()Object 的方法。

由于当时我的代码有点强迫症,实际上我确实在源代码中保存了对象的结构:

/*
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 支持并从头开始重新设计应用程序;新版本托管在这里。它适用于开箱即用的 IE9!

4

3 回答 3

4

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

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

JSON 3...

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

与 JSON 2 相比,JSON 3 不...

  • 将 toJSON() 方法添加到 Boolean、Number 和 String 原型。这些不是任何标准的一部分,并且由于 stringify() 实现的设计而变得多余。
  • 将 toJSON() 或 toISOString() 方法添加到 Date.prototype。请参阅下面有关日期序列化的说明。
于 2012-10-10T21:13:45.290 回答
3

试试https://github.com/douglascrockford/JSON-js

于 2012-10-10T21:15:08.377 回答
1

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

于 2012-10-10T21:24:11.427 回答