jQuery.parseJSON は、JSON 内のエスケープされた単一引用符が原因で「無効な JSON」エラーをスローします 質問する

jQuery.parseJSON は、JSON 内のエスケープされた単一引用符が原因で「無効な JSON」エラーをスローします 質問する

私は を使用してサーバーにリクエストを送信しjQuery.post()、サーバーは JSON オブジェクト ( など{ "var": "value", ... }) を返します。ただし、値のいずれかに単一引用符 ( のように適切にエスケープされている\') が含まれている場合、jQuery はそれ以外の有効な JSON 文字列を解析できません。次に、私が意味する例を示します (Chromeのコンソールで実行):

data = "{ \"status\": \"success\", \"newHtml\": \"Hello \\\'x\" }";
eval("x = " + data); // { newHtml: "Hello 'x", status: "success" }

$.parseJSON(data); // Invalid JSON: { "status": "success", "newHtml": "Hello \'x" }

これは正常ですか? JSON 経由で単一引用符を適切に渡す方法はないのでしょうか?

ベストアンサー1

上のステートマシン図によると、JSONウェブサイトエスケープされた二重引用符のみが許可され、一重引用符は使用できません。一重引用符はエスケープする必要はありません。

http://www.json.org/string.gif


アップデート- 興味のある方のための詳細情報:


ダグラス・クロックフォードは、JSON仕様が文字列内でエスケープされたシングルクォートを許可しない理由を具体的に述べていない。しかし、JavaScript の付録 E: 良い部分、 彼は書く:

JSON の設計目標は、最小限、移植性、テキスト、JavaScript のサブセットであることでした。相互運用するために合意する必要がある点が少ないほど、相互運用が容易になります。

そのため、すべての JSON 実装が同意しなければならないルールが 1 つ減るため、文字列の定義には二重引用符のみを使用することにしたのかもしれません。結果として、定義上、文字列は二重引用符でのみ終了できるため、文字列内の一重引用符によって誤って文字列が終了することは不可能になります。したがって、正式な仕様では一重引用符のエスケープを許可する必要はありません。


もう少し深く掘り下げると、クロックフォードの org.json JavaでのJSONの実装はより許容され、 する 一重引用符を許可します:

toString メソッドによって生成されるテキストは、JSON 構文規則に厳密に準拠しています。コンストラクターは、受け入れるテキストに関してより寛容です。

...

  • 文字列は ' (一重引用符) で囲むことができます。

これは、JSONトークンソースコード。このnextStringメソッドはエスケープされた一重引用符文字を受け入れ、二重引用符文字と同じように扱います。

public String nextString(char quote) throws JSONException {
    char c;
    StringBuffer sb = new StringBuffer();
    for (;;) {
        c = next();
        switch (c) {

        ...

        case '\\':
            c = this.next();
            switch (c) {

            ...

            case '"':
            case '\'':
            case '\\':
            case '/':
                sb.append(c);
                break;
        ...

メソッドの先頭には、次のような有益なコメントがあります。

正式な JSON 形式では、単一引用符で囲まれた文字列は許可されませんが、実装ではそれを受け入れることができます。

そのため、一部の実装では一重引用符が受け入れられますが、これに頼るべきではありません。多くの一般的な実装ではこの点に関して非常に制限が厳しく、一重引用符で囲まれた文字列やエスケープされた一重引用符を含む JSON は拒否されます。


最後に、これを元の質問に結び付けると、jQuery.parseJSONまずブラウザのネイティブJSONパーサーまたはロードされたライブラリ(例えばjs2.js の構文該当する場合(ちなみに、定義されていない場合は jQuery ロジックのベースとなるライブラリですJSON)。したがって、jQuery は、その基礎となる実装と同じ程度にしか許容されません。

parseJSON: function( data ) {
    ...

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    ...

    jQuery.error( "Invalid JSON: " + data );
},

私の知る限り、これらの実装は公式の JSON 仕様にのみ準拠しており、一重引用符は受け入れません。したがって、jQuery も同様です。

おすすめ記事