JSON: dlaczego unika się ukośników?

369

Powód tego „ucieka” mi.

JSON ucieka przed ukośnikiem, więc skrót {a: "a/b/c"}jest serializowany jak {"a":"a\/b\/c"}zamiast {"a":"a/b/c"}.

Dlaczego?

Jason S.
źródło
4
FWIW Nigdy nie widziałem ucieczki przed ukośnikami w JSON, właśnie zauważyłem to z biblioteką Java na code.google.com/p/json-simple
Jason S
24
PHP json_encode()ucieka ukośniki domyślnie, ale ma tę JSON_UNESCAPED_SLASHESopcję, począwszy od PHP 5.4.0 (marzec 2012)
Walter Tross
6
Oto kod PHP, który nie ucieknie przed każdym ukośnikiem, tylko w '</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx 20.01.2013
Czy kod zawiera „</”: czy zaczyna się od echa? Ponieważ rozpoczęcie od echa kończy się niepowodzeniem. Po prostu nic nie rozumiem. Tak, zastąpiłem mój $ obj dla mojej zmiennej :)
marciokoko
JSON niczego nie ucieka ani nie szereguje ... twój serializator JSON tak. Z którego korzystasz?
Wyścigi lekkości na orbicie

Odpowiedzi:

284

JSON nie wymaga tego, pozwala ci to zrobić. Pozwala także użyć „\ u0061” dla „A”, ale nie jest to wymagane. Zezwalanie \/pomaga przy osadzaniu JSON w <script>znaczniku, co nie pozwala na </wewnętrzne ciągi, jak wskazuje Seb.

Niektóre API ASP.NET Ajax / JSON firmy Microsoft używają tej luki, aby dodać dodatkowe informacje, np. Data i godzina zostaną wysłane jako "\/Date(milliseconds)\/". (Fuj)

Ruben
źródło
4
Byłoby dobrze, uciekając tylko </. Chociaż JSON i tak często nie jest osadzony w znacznikach skryptów.
Ruben
8
Zobacz ten post na blogu z uzasadnieniem formatu daty JSON programu ASP.NET: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout
25
JSON musi zostać zastąpiony, ponieważ konkretna implementacja serializatora JSON generuje część JSON, który ( mimo że jest w pełni poprawny JSON ) ma dodatkowe znaki, więc można go również upuścić w elemencie skryptu HTML jako literał JS ?! To nie tyle wyrzucanie dziecka z kąpielą, ile wyrzucanie dziecka, ponieważ ktoś kupił mu zestaw skrzydeł wodnych.
Quentin
15
Nie rozumiem, dlaczego serializator JSON dbałby nawet o to, gdzie kończy się JSON. Na stronie internetowej, w żądaniu HTTP, cokolwiek. Pozwól, aby końcowy moduł renderujący wykonał dodatkowe kodowanie, jeśli tego potrzebuje.
Dan Ross
5
@DanRoss I może. Ucieczka /nie jest wymagana , jest dozwolona , aby ułatwić korzystanie z JSON. Jeśli nie chcesz uciec /, nie rób tego.
Andreas
35

Specyfikacja JSON mówi, że MOŻESZ uciec przed ukośnikiem, ale nie musisz.

Harold L.
źródło
9
Czy możesz dodać link do tej konkretnej sekcji?
Ryan Gates
1
Specyfikacja tego nie mówi. W rzeczywistości wszystko to mówi, że musisz uciec od charakteru solidus. Zobacz ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert
10
@JoaEbert: Trzeba odwrócić solidus odwrotny, ale nie musisz uciekać solidus. Sekcja 9 mówi: „Wszystkie znaki mogą być umieszczane w cudzysłowie, z wyjątkiem znaków, które muszą być poprzedzone znakami: cudzysłów (U + 0022), odwrotny solidus (U + 005C) oraz znaki kontrolne U + 0000 do U + 001F. „
Harold L
4
Dzięki Harold! Masz rację, również pokazaną na rysunku 5, ponieważ „dowolny punkt kodowy oprócz ...” wyraźnie stwierdza, że ​​/ jest opcjonalny.
Joa Ebert,
15

Zadałem to samo pytanie jakiś czas temu i sam musiałem na nie odpowiedzieć. Oto, co wymyśliłem:

Wygląda na to, że moja pierwsza myśl [ że pochodzi z korzeni JavaScript ] była poprawna.

'\/' === '/'w JavaScript, a JSON jest poprawnym JavaScript. Dlaczego jednak inne ignorowane zmiany znaczenia (jak \z) nie są dozwolone w JSON?

Kluczem do tego było czytanie http://www.cs.tut.fi/~jkorpela/www/revsol.html , a następnie http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . Funkcja ukośnika ucieczki pozwala osadzić JSON w HTML (jako SGML) i XML.

Boldewyn
źródło
5
Mechanizm dostarczania danych strukturalnych nie powinien być powiązany z konstrukcjami językowymi. Może się to zmienić w przyszłości ... ale może to wyjaśniać decyzje projektowe, jeśli byłby jakiś twórca JSON.
'\ /' === '/' Więc nie muszę usuwać scen z ukośników podczas odbierania mojego jsonp?
Timmetje
8

PHP domyślnie unika ukośników do przodu i prawdopodobnie dlatego tak często się pojawia. Nie jestem pewien, dlaczego, ale być może dlatego, że osadzenie łańcucha "</script>"wewnątrz <script>tagu jest uważane za niebezpieczne.

Funkcję tę można wyłączyć, przekazując JSON_UNESCAPED_SLASHESflagę, ale większość programistów nie będzie jej używać, ponieważ oryginalny wynik jest już prawidłowy JSON.

Simon East
źródło
5

Brzydki PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESMusi być domyślny, a nie (dziwne) opcja ... Jak to powiedzieć do php-deweloperów?

Domyślna musi być najbardziej częste stosowanie, a (bieżące) najpowszechniej stosowanych standardów jako UTF-8. Ile fragmentów kodu PHP w Githubie lub w innym miejscu potrzebuje tej dziwnej funkcji „osadzonej w HTML”?

Peter Krauss
źródło
2
Właśnie tak! Jednak PHP promuje wszystkie swoje dziwne błędy w przyszłości, aby nie złamać żadnych typowych poprzednich błędów we wszystkich tych uszkodzonych historycznych fragmentach PHP, które rozprzestrzeniają się na całym świecie jak szkodnik. Dlatego wszystkie te błędne decyzje podejmowane przez PHP, co oznacza, że ​​prawie wszystkie decyzje dotyczące PHP kiedykolwiek stały się standardem. Nie możesz oczekiwać, że standardy się zmienią, dlatego każdy programista PHP musi znać i wdrażać wszystkie nieskończone ilości obejść wszystkich poważnych błędów znalezionych w PHP. Wpisz stackoverflow ..
Tino
Całkowicie się mylisz. Wynika to z JavaScript. Jak wskazano poniżej. W JS '\/' === '/'zwraca true. Radziłbym trzymać się faktów. Większość ludzi jest w stanie poradzić sobie z kilkoma niespójnymi nazwami funkcji. Tylko dlatego, że nie widzisz przeszłości, co nie czyni PHP złym narzędziem.
Cobolt
1
Cześć @Cobolt, To stare pytanie, nie używam dzisiaj PHP ... Ale, jak na blogu dyskusyjnym, rdzeń brzmi: „Domyślnie MUSI być najczęściej używanym” , więc brzydota polega na ignorowaniu tego „najczęstszego używania” (także brzydkiego) zachowania Javascript.
Peter Krauss,
1
To nie jest miejsce, by narzekać na jakiś konkretny język. Wskazanie na to, co PHP obecnie robi i jak je wyłączyć, byłoby bardziej pomocne, a teraz dodano odpowiedź, która to robi .
IMSoP,