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()オブジェクトのメソッドを呼び出そうとしたことに起因するエラーが発生し続けました。

当時、私は自分のコードでちょっと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のサポートをやめ、アプリをゼロから完全に再設計しました。新しいバージョンはここでホストされます。そして、それは箱から出してIE9で動作します!

4

3 に答える 3

4

これが最良の代替品だと思います:http://bestiejs.github.com/json3/

次の理由で、CrockfordのJSON 2よりも優れていると主張しています(彼らのサイトから):

JSON 3 .. ..

  • プリミティブラッパーオブジェクトを正しくシリアル化します(問題#28)。
  • 循環構造をシリアル化するときにTypeErrorをスローします(JSON 2は、呼び出しスタックがオーバーフローするまで繰り返します)。
  • 機能テストを利用して、壊れたまたは不完全なネイティブJSON実装を検出します(JSON 2はネイティブ関数の存在のみをチェックします)。テストは実行時に1回だけ実行されるため、値を解析またはシリアル化するときに追加のパフォーマンスコストは発生しません。

JSON 2とは対照的に、JSON3は...

  • toJSON()メソッドをブール、数値、および文字列のプロトタイプに追加します。これらは標準の一部ではなく、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 に答える