JSON Webサイトの状態マシン図によると、エスケープされた二重引用符文字のみが許可され、単一引用符は許可されていません。一重引用符はエスケープする必要はありません:
更新 -興味のある方のための詳細情報:
Douglas Crockfordは、JSON仕様で文字列内のエスケープされた単一引用符が許可されない理由を具体的に述べていません。ただし、JavaScript:The Good Partsの付録EでのJSONの議論中に、彼は次のように書いています。
JSONの設計目標は、最小限、移植可能、テキスト、およびJavaScriptのサブセットでした。相互運用するために同意する必要が少ないほど、相互運用が容易になります。
そのため、おそらくすべてのJSON実装が同意しなければならないルールが1つ少ないため、二重引用符を使用して文字列のみを定義できるようにすることにしました。その結果、定義によって文字列は二重引用符文字でしか終了できないため、文字列内の単一引用符文字が誤って文字列を終了することはありません。したがって、正式な仕様で単一引用符文字をエスケープすることを許可する必要はありません。
少し深く掘る、クロックフォードの
org.jsonの Java用のJSONの実装は、より許容されかつ
ず、単一引用符を許可します:
toStringメソッドによって生成されるテキストは、JSON構文規則に厳密に準拠しています。コンストラクターは、受け入れるテキストでより寛容です。
...
これは、JSONTokenerソースコードによって確認されます。この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パーサーまたはjson2.jsなどのロードされたライブラリ(該当する場合、jQueryロジックがJSON
定義されていない場合にjQueryロジックが使用するライブラリ)を使用しようとします。。したがって、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も受け入れません。