JSON: чому врятуються косої частини вперед?


369

Причина цього «рятується» від мене.

JSON уникає прямої косої риси, тому хеш {a: "a/b/c"}серіалізується як {"a":"a\/b\/c"}замість {"a":"a/b/c"}.

Чому?


4
FWIW Я ніколи не бачив, щоб в JSON врятувалися косої риси, я просто помітив це в бібліотеці Java за адресою code.google.com/p/json-simple
Jason S

24
PHP json_encode()за замовчуванням уникає косої риски, але має JSON_UNESCAPED_SLASHESможливість починаючи з PHP 5.4.0 (березень 2012)
Walter Tross

6
Ось PHP-код, який не зможе уникнути кожної косої риси, лише в '</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx

Чи включає код "</": чи він починається на відлуння? Тому що починати з ехо для мене не вдається. Я просто нічого не отримую. Так, я замінив свій $ obj на свою змінну :)
marciokoko

JSON нічого не уникає і не серіалізує ... ваш серіалізатор JSON робить. Який ви використовуєте?
Гонки легкості по орбіті

Відповіді:


284

JSON не вимагає від вас цього робити, він дозволяє вам це робити. Це також дозволяє використовувати "\ u0061" для "A", але це не потрібно. Дозвіл \/допомагає при вставці JSON у <script>тег, який не допускає </внутрішніх рядків, як, наприклад, Seb.

Деякі з API ASP.NET Ajax / JSON від Microsoft використовують цю лазівку для додавання додаткової інформації, наприклад, час надсилання буде надіслано як "\/Date(milliseconds)\/". (Гидота)


4
Це було б добре, рятуючись просто </. Хоча JSON так і не часто вбудовується в теги сценаріїв.
Рубен

8
Дивіться це повідомлення в блозі щодо обґрунтування формату дати ASP.NET JSON: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
ван

25
JSON потрібно замінити, оскільки конкретна реалізація серіалізатора JSON виводить деякий JSON, який ( хоча є повністю дійсним JSON ) має деякі зайві символи, тому його також можна перенести в елемент сценарію HTML як буква JS ?! Це не стільки викидання дитини разом з водою, скільки викидання дитини, тому що хтось купив йому набір водних крил.
Квентін

15
Чого я не отримую, це те, чому серіалізатор JSON навіть не піклується про те, де JSON потрапляє. На веб-сторінці, у HTTP-запиті, будь-що. Нехай остаточний рендер робить додаткове кодування, якщо воно цього потребує.
Ден Росс

5
@DanRoss І це може. Уникнути /не потрібно , дозволяється полегшити використання JSON. Якщо ви не хочете бігти /, то не робіть.
Андреас

35

Специфікація JSON говорить, що МОЖЕТЕ уникнути косої риски вперед, але цього не потрібно.


9
Чи можете ви додати посилання на цей конкретний розділ?
Райан Гейтс

1
Специфікація цього не говорить. Насправді все це говорить, що вам потрібно уникнути характеру солідуса. Дивіться ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Еберт

10
@JoaEbert: Зворотний солідус потрібно уникнути, але не потрібно уникати солідуса. У розділі 9 сказано: "Усі символи можуть бути розміщені в лапках, за винятком символів, які слід уникати: лапки (U + 0022), зворотного соліда (U + 005C) та контрольних символів U + 0000 до U + 001F. "
Гарольд L

4
Дякую Гарольде! Ви праві, що також показано на малюнку 5, як "будь-яка точка коду, крім ..." чітко зазначає, що / необов'язково.
Джоа Еберт

15

Я запитав те саме питання деякий час тому і мав відповісти на нього сам. Ось що я придумав:

Здається, моя перша думка [ що вона походить від коренів JavaScript ] була правильною.

'\/' === '/'в JavaScript, а JSON є дійсним JavaScript. Однак чому інші ігноровані втечі (як \z) не допускаються в JSON?

Ключовим для цього було читання http://www.cs.tut.fi/~jkorpela/www/revsol.html , а потім http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . Особливість врізання косою рисою дозволяє вбудовувати JSON у HTML (як SGML) та XML.


5
Структурований механізм доставки корисних навантажень даних не повинен прив'язуватися до мовних конструкцій .. оскільки це може змінитися в майбутньому ... але це може пояснити проектні рішення, якщо хтось із творців JSON був таким.

'\ /' === '/' Тому мені не потрібно відміняти прямі нахили вперед під час отримання мого jsonp?
Timmetje

8

PHP уникає косої риски за замовчуванням, тому, мабуть, це так часто з'являється. Я не впевнений, чому, але можливо, тому що вбудовування рядка "</script>"всередині <script>тегу вважається небезпечним.

Цю функціональність можна відключити, передавши JSON_UNESCAPED_SLASHESпрапор, але більшість розробників не використовуватиме це, оскільки вихідний результат вже є дійсним JSON.


5

Потворний PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESПовинен бути по замовчуванню, а ні (дивно) варіант ... Як сказати це PHP-розробників?

За замовчуванням ОБОВ'ЯЗКОВО бути найчастішим використанням, а (чинними) найбільш широко використовуваними стандартами як UTF8. Скільки фрагментів PHP-коду в Github чи іншому місці потребує цієї екзотичної функції "вбудованого в HTML"?


2
Правильно сказано! Однак PHP просуває всі дивні помилки в майбутньому, щоб не порушити жодних поширених попередніх помилок у всіх тих зіпсованих історичних фрагментах PHP, які поширюються по всьому світу, як шкідник. Отже, всі ті неправильні рішення, прийняті PHP, а це означає, що майже всі рішення щодо PHP коли-небудь стають стандартом. Ви не можете очікувати зміни стандартів, отже, кожен розробник PHP повинен знати та впроваджувати всі ці нескінченні кількості обхідних шляхів проти всіх тих серйозних помилок, які знайдені в PHP. Введіть stackoverflow ..
Тіно,

Ви абсолютно помиляєтесь. Це завдяки JavaScript. Як зазначено нижче. У JS '\/' === '/'повертає true. Я б порадив дотримуватися фактів. Більшість людей здатні впоратися з кількома суперечливими іменами функцій. Просто тому, що ви не бачите минулого, що не робить PHP поганим інструментом.
Кобольт

1
Привіт @Cobolt, це старе питання, я сьогодні не використовую PHP ... Але, як і дискусійний блог, ядро "ЯК ПОВИНЕН бути найчастішим використанням" , тому потворність полягає в ігноруванні цього "найчастішого використання" (також негарна) поведінка Javascript.
Пітер Краусс

1
Це не місце для того, щоб розігрувати будь-яку конкретну мову. Вказівка ​​того, що PHP робить зараз , і як його відключити, було б кориснішим, і зараз додано відповідь, яка це робить .
IMSoP
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.