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.
Any character may be escaped
, że może to wyjaśniać, dlaczego niektóre implementacje umożliwiają unikanie pojedynczych cudzysłowów.\'
jest nadal niedozwolona. Byłoby miło, gdyby RFC było bardziej wyraźne w tej kwestii.Jeśli potrzebujesz pojedynczy cudzysłów wewnątrz łańcucha, ponieważ \”jest zdefiniowana przez spec, stosowanie
\u0027
zobaczyć http://www.utf8-chartable.de/ dla nich wszystkichedytuj: proszę wybaczyć moje niewłaściwe użycie słowa backticks w komentarzach. Miałem na myśli odwrotny ukośnik. Chodzi mi o to, że w przypadku zagnieżdżenia ciągów w innych ciągach, myślę, że bardziej użyteczne i czytelne może być użycie Unicode zamiast wielu odwrotnych ukośników, aby uniknąć pojedynczego cudzysłowu. Jeśli nie jesteś zagnieżdżony, naprawdę łatwiej jest po prostu umieścić tam zwykły stary cytat.
źródło
var jsonEncodedAsString = <?= json_encode(myEncodedJson) ?>
gdziemyEncodedJson
jest wynikiem poprzedniejjson_encode
To zajmie ucieczce swoją apostrof, właściwie, to po prostu wyjść coś wielki łańcuch owinięty w cudzysłowach, więc pojedyncze cudzysłowy nie będzie uciec, ale podwójne cudzysłowy będzie.Rozumiem, na czym polega problem, a kiedy patrzę na specyfikację, jasne jest, że pojedyncze cudzysłowy bez poprawek powinny być poprawnie analizowane.
Korzystam z funkcji jQuery.parseJSON w jquery`s, aby przeanalizować ciąg JSON, ale nadal pojawia się błąd parsowania, gdy w danych przygotowanych za pomocą json_encode występuje pojedynczy cytat.
Czy to może być błąd w mojej implementacji, który wygląda tak (PHP - po stronie serwera):
Ostatnim krokiem jest zapisanie łańcucha zakodowanego w JSON w zmiennej JS:
Jeśli użyję „” zamiast „”, nadal będzie generować błąd.
ROZWIĄZANIE:
Jedyną rzeczą, która działała dla mnie, było użycie maski bitowej JSON_HEX_APOS do konwersji pojedynczych cudzysłowów w następujący sposób:
Czy istnieje inny sposób rozwiązania tego problemu? Czy mój kod jest nieprawidłowy lub źle napisany?
Dzięki
źródło
Gdy wysyłasz pojedynczą ofertę w zapytaniu
Gdy otrzymasz wartość, w tym pojedynczy cytat
Jeśli chcesz wyszukać / wstawić wartość, która zawiera pojedynczy cytat w zapytaniu
xxx=Replace(empid,"'","''")
źródło
Uderzenie podobnego problemu przy użyciu CakePHP w celu wygenerowania bloku skryptu JavaScript przy użyciu natywnego PHP
json_encode
.$contractorCompanies
zawiera wartości, które mają pojedyncze cudzysłowy i jak wyjaśniono powyżej ijson_encode($contractorCompanies)
nie oczekuje się od nich ucieczki, ponieważ jest to poprawny JSON.Dodając addlashes () wokół łańcucha zakodowanego w JSON, możesz następnie uciec od cudzysłowów, pozwalając Cake / PHP na echo poprawnego javascript w przeglądarce. Błędy JS znikają.
źródło
Próbowałem zapisać obiekt JSON z żądania XHR w atrybucie data5 * HTML5. Wypróbowałem wiele powyższych rozwiązań bez powodzenia.
Ostatecznie skończyłem na zamianie pojedynczego cudzysłowu na
'
kod'
za pomocą wyrażenia regularnego po wywołaniu metody stringify () w następujący sposób:źródło
Ciekawy. Jak generujesz JSON po stronie serwera? Czy używasz funkcji bibliotecznej (takiej jak
json_encode
PHP), czy też ręcznie budujesz ciąg JSON?Jedyne, co przykuło moją uwagę, to apostrof ucieczki (
\'
). Ponieważ używasz podwójnych cudzysłowów, tak jak powinieneś, nie ma potrzeby unikania pojedynczych cudzysłowów. Nie mogę sprawdzić, czy to jest rzeczywiście przyczyną Twojego błędu jQuery, ponieważ sam nie zaktualizowałem do wersji 1.4.1.źródło