Zgodnie ze schematem automatu stanów na stronie JSON dozwolone są tylko znaki podwójnego cudzysłowu, a nie pojedyncze cudzysłowy. Nie trzeba wstawiać znaków pojedynczego cudzysłowu:
Aktualizacja - więcej informacji dla zainteresowanych:
Douglas Crockford nie wyjaśnia konkretnie, dlaczego specyfikacja JSON nie zezwala na unikanie pojedynczych cudzysłowów w łańcuchach. Jednak podczas dyskusji o JSON w załączniku E do JavaScript: The Good Parts pisze:
Cele projektowe JSON miały być minimalne, przenośne, tekstowe i podzbiór JavaScript. Im mniej musimy się zgodzić na współpracę, tym łatwiej możemy współpracować.
Być może więc postanowił zezwolić na definiowanie łańcuchów tylko przy użyciu podwójnych cudzysłowów, ponieważ jest to jedna mniejsza zasada, na którą muszą się zgodzić wszystkie implementacje JSON. W rezultacie pojedynczy znak cudzysłowu w ciągu nie może przypadkowo zakończyć łańcucha, ponieważ z definicji ciąg może być zakończony tylko znakiem podwójnego cudzysłowu. Dlatego nie ma potrzeby zezwalania na ucieczkę pojedynczego cudzysłowu w specyfikacji formalnej.
Kopanie trochę głębiej, Crockforda za
org.json implementacja JSON Java jest bardziej dopuszczalne i
nie pozwalają pojedyncze znaki cudzysłowu:
Teksty wytworzone metodami toString ściśle odpowiadają regułom składni JSON. Konstruktorzy bardziej wybaczają w tekstach, które zaakceptują:
...
- Ciągi można cytować za pomocą „(pojedynczy cudzysłów).
Potwierdza to kod źródłowy JSONTokener . nextString
Metoda akceptuje uciekł cytatów i traktuje je tak jak cudzysłów:
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;
...
Na górze metody znajduje się pouczający komentarz:
Formalny format JSON nie dopuszcza ciągów w pojedynczych cudzysłowach, ale implementacja może je akceptować.
Dlatego niektóre implementacje zaakceptują pojedyncze cytaty - ale nie powinieneś na tym polegać. Wiele popularnych implementacji jest pod tym względem dość restrykcyjnych i odrzuci JSON, który zawiera ciągi pojedynczego cudzysłowu i / lub uniknął pojedynczych cudzysłowów.
Na koniec, aby powiązać to z pierwotnym pytaniem, jQuery.parseJSON
najpierw próbuje się użyć natywnego parsera JSON przeglądarki lub załadowanej biblioteki, takiej jak json2.js, o ile ma to zastosowanie (która z boku jest biblioteką, na której opiera się logika jQuery, jeśli JSON
nie jest zdefiniowana) . W związku z tym jQuery może być tak liberalne jak ta implementacja:
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 );
},
O ile wiem, implementacje te są zgodne tylko z oficjalną specyfikacją JSON i nie akceptują pojedynczych cudzysłowów, dlatego też jQuery nie.