json encode php экранирование кавычек
Как избежать двойных кавычек в JSON
Я пытаюсь показать двойные кавычки, но он показывает одну из обратных косых черт:
6 ответов:
(только одна обратная косая черта ( \ ) перед кавычками).
Он показывает обратную косую черту, потому что вы также избегаете обратной косой черты.
помимо двойных кавычек, вы также должны избегать обратных косых черт, если вы хотите включить их в свою строку в кавычках JSON. Однако если вы собираетесь использовать обратную косую черту в escape-последовательности, очевидно, вы не должны избегать ее.
когда и где использовать \\» вместо. Хорошо, если вы похожи на меня, вы будете чувствовать себя так же глупо, как и я, когда я понял, что я делаю после того, как нашел эту нить.
+1: поскольку это текстовая строка JavaScript, двойная обратная косая черта двойная кавычка \» тоже будет работать; потому что двойная кавычка не нуждается в экранировании в одной цитируемой строке, например ‘\»‘ и ‘»‘ результат в той же строке JS.
обратите внимание, что это чаще всего происходит, когда содержимое было «дважды закодировано», что означает, что алгоритм кодирования был случайно вызван дважды.
первый вызов будет кодировать значение «text2»:
от: сегодня стартуют наши Rundreise «пример текста». Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
TO: сегодня стартуют наши Rundreise \»пример\». Jeden Tag wird ein neues Reiseziel angesteuert bis ВИР.
вторая кодировка затем преобразует его снова, экранируя уже экранированные символы:
от: сегодня стартуют наши Rundreise \»пример\». Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
TO: Heute startet unsere Rundreise \\\ » пример текста\\\». Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
Итак, если вы несете ответственность за выполнение серверу, проверьте конечно, нет двух шагов, пытающихся кодировать одно и то же содержимое.
чтобы избежать обратных косых черт, которые вызывают проблемы для данных JSON, я использую эту функцию.
если вы хотите избежать двойной кавычки в JSON, используйте \\, чтобы избежать ее.
пример, если вы хотите создать json следующего объекта javascript
json_encode
(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL json >= 1.2.0)
json_encode — Возвращает JSON-представление данных
Описание
На кодирование влияет параметр flags и, кроме того, кодирование значений типа float зависит от значения serialize_precision.
Список параметров
Функция работает только с кодировкой UTF-8.
PHP реализует надмножество JSON, который описан в первоначальном » RFC 7159.
Устанавливает максимальную глубину. Должен быть больше нуля.
Возвращаемые значения
Возвращает строку ( string ), закодированную JSON или false в случае возникновения ошибки.
Список изменений
Примеры
Пример #1 Пример использования json_encode()
Результат выполнения данного примера:
Пример #2 Пример использования json_encode() с опциями
Результат выполнения данного примера:
Пример #3 Пример использования опции JSON_NUMERIC_CHECK
Результатом выполнения данного примера будет что-то подобное:
Пример #4 Пример с последовательными индексами, начинающимися с нуля, и непоследовательными индексами массивов
Результат выполнения данного примера:
Пример #5 Пример использования опции JSON_PRESERVE_ZERO_FRACTION
Результат выполнения данного примера:
Примечания
в случае возникновения ошибки кодирования можно использовать json_last_error() для определения точной ошибки.
При кодировании массива в случае, если его индексы не являются последовательными числами от нуля, то все индексы кодируются в строковые ключи для каждой пары индекс-значение.
Смотрите также
User Contributed Notes 39 notes
This isn’t mentioned in the documentation for either PHP or jQuery, but if you’re passing JSON data to a javascript program, make sure your program begins with:
Are you sure you want to use JSON_NUMERIC_CHECK, really really sure?
Just watch this usecase:
// International phone number
json_encode (array( ‘phone_number’ => ‘+33123456789’ ), JSON_NUMERIC_CHECK );
?>
And then you get this JSON:
Maybe it makes sense for PHP (as is_numeric(‘+33123456789’) returns true), but really, casting it as an int?!
So be careful when using JSON_NUMERIC_CHECK, it may mess up with your data!
A note of caution: If you are wondering why json_encode() encodes your PHP array as a JSON object instead of a JSON array, you might want to double check your array keys because json_encode() assumes that you array is an object if your keys are not sequential.
SOLUTION: Use array_values() to re-index the array.
This is intended to be a simple readable json encode function for PHP 5.3+ (and licensed under GNU/AGPLv3 or GPLv3 like you prefer):
I came across the «bug» where running json_encode() over a SimpleXML object was ignoring the CDATA. I ran across http://bugs.php.net/42001 and http://bugs.php.net/41976, and while I agree with the poster that the documentation should clarify gotchas like this, I was able to figure out how to workaround it.
You need to convert the SimpleXML object back into an XML string, then re-import it back into SimpleXML using the LIBXML_NOCDATA option. Once you do this, then you can use json_encode() and still get back the CDATA.
Although this is not documented on the version log here, non-UTF8 handling behaviour has changed in 5.5, in a way that can make debugging difficult.
Passing a non UTF-8 string to json_encode() will make the function return false in PHP 5.5, while it will only nullify this string (and only this one) in previous versions.
PHP 5.5 has it right of course (if encoding fails, return false) but its likely to introduce errors when updating to 5.5 because previously you could get the rest of the JSON even when one string was not in UTF8 (if this string wasn’t used, you’d never notify it’s nulled)
If you are planning on using this function to serve a json file, it’s important to note that the json generated by this function is not ready to be consumed by javascript until you wrap it in parens and add «;» to the end.
It took me a while to figure this out so I thought I’d save others the aggravation.
( ‘Content-Type: text/javascript; charset=utf8’ );
header ( ‘Access-Control-Allow-Origin: http://www.example.com/’ );
header ( ‘Access-Control-Max-Age: 3628800’ );
header ( ‘Access-Control-Allow-Methods: GET, POST, PUT, DELETE’ );
This function is more accurate and faster than, for example, that one:
http://www.php.net/manual/ru/function.json-encode.php#89908
(RU: эта функция работает более точно и быстрее, чем указанная выше).
Please note that there was an (as of yet) undocumented change to the json_encode() function between 2 versions of PHP with respect to JSON_PRETTY_PRINT:
In version 5.4.21 and earlier, an empty array [] using JSON_PRETTY_PRINT would be rendered as 3 lines, with the 2nd one an empty (indented) line, i.e.:
«data»: [
In version 5.4.34 and above, an empty array [] using JSON_PRETTY_PRINT would be rendered as exactly [] at the spot where it occurs, i.e.
«data: [],
This is not mentioned anywhere in the PHP changelist and migration documentations; neither on the json_encode documentation page.
This is very useful to know when you are parsing the JSON using regular expressions to manually insert portions of data, as is the case with my current use-case (working with JSON exports of over several gigabytes requires sub-operations and insertion of data).
Solution for UTF-8 Special Chars.
If you need to force an object (ex: empty array) you can also do:
Be careful with floating values in some locales (e.g. russian) with comma («,») as decimal point. Code:
Which is NOT a valid JSON markup. You should convert floating point variable to strings or set locale to something like «LC_NUMERIC, ‘en_US.utf8′» before using json_encode.
Here is a bit more on creating an iterator to get at those pesky private/protected variables:
class Kit implements IteratorAggregate <
If I want to encode object whith all it’s private and protected properties, then I implements that methods in my object:
Found that much more simple than regular expressions with PHP serialized objects.
For anyone who would like to encode arrays into JSON, but is using PHP 4, and doesn’t want to wrangle PECL around, here is a function I wrote in PHP4 to convert nested arrays into JSON.
I don’t make a claim that this function is by any means complete (for example, it doesn’t handle objects) so if you have any improvements, go for it.
// We first copy each key/value pair into a staging array,
// formatting each key and value properly as we go.
PHP JSON String, экранирование двойных кавычек для вывода JS
В JS файле я могу получить доступ к следующей информации:
В результате получается результат:
Ввод этого результата в http://jsonlint.com/ возвращает ошибку. Удаление двойных кавычек вокруг «special» проверяет строку.
Каков наилучший способ создать строку JSON из PHP и правильно ее избежать для использования в JS файле?
7 ответов
Тем не менее, цитаты «будут приводить к недействительным JSON, но это только проблема, если вы используете json_encode() и просто ожидаете, что PHP будет магически избегать ваших котировок. Вам нужно сделать эскалацию самостоятельно.
Другим способом было бы закодировать кавычки, используя htmlspecialchars:
Я успешно только что сделал это:
ПРИМЕЧАНИЕ: вы можете добавить опцию JSON_HEX_APOS чтобы заменить одиночную кавычку на значение HEX JSON_HEX_APOS если у вас есть JSON_HEX_APOS с одинарными JSON_HEX_APOS в JavaScript.
Использовать json_encode($json_array, JSON_HEX_QUOT); начиная с версии 5.3: http://php.net/manual/en/json.constants.php
Это решение, которое заботится о одинарных и двойных кавычках:
Я просто столкнулся с этой проблемой, и фактическая проблема заключалась в том, что я забыл добавить правильный заголовок приложения /json, прежде чем выплевывать фактические данные JSON.
У меня была проблема с пользователями, невинно вводящими €, а некоторые использовали двойные кавычки для определения своего контента. Я подправил пару ответов с этой страницы и других, чтобы, наконец, определить мой маленький маленький обходной путь
Я надеюсь, что это помогает кому-то/кому-то это улучшить.
JSON в PHP: примеры json_encode, json_decode, работа с кириллицей и utf-8
Давайте разберем, как работает JSON в PHP
Подробную документацию всегда можно найти по этой ссылке:
Кодирование при помощи функции json_encode
Функция работает только с кодировкой UTF-8.
Рассмотрим простой пример:
Результат выполнения кода:
Как видим ассоциативный массив превратился в обычную json строку.
Более сложный пример:
Результат выполнения кода:
Что произошло c кириллицей?
Дело в том, что по умолчанию многобайтовые символы Unicode кодируются как \uXXXX. При раскодировании функцией json_decode они преобразуются в нормальные строки. В некоторых случаях мы можем захотеть избежать этого экранирования, например, чтобы посмотреть как выглядит наш JSON.
Для этого воспользуемся флагом JSON_UNESCAPED_UNICODE:
Получаем такой результат:
Мы может еще в целях изучения кода преобразовать его в более человеческий вид, при помощи дополнительного флага JSON_PRETTY_PRINT
Получаем такой результат:
Мы разобрались, как кодировать наши переменные в формат JSON при помощи json_encode.
Другие предопределенные константы с префиксом JSON_ https://www.php.net/manual/ru/json.constants.php
Декодирование c помощью json_decode
Допустим у нас есть строка в формате JSON. Возьмем ее из предыдущего примера:
Давайте раскодируем ее:
У нас получился результат:
Видим, что это тип переменной stdClass. То есть несмотря на то, что мы изначально кодировали в json обычный ассоциативный массив, в результате декодирования у нас получился объект. Подробнее об этом поведении написано здесь: https://phpstack.ru/php/json_decode-kak-perevesti-rezultat-v-massiv.html
Как нам все таки получить обычный массив? Нужно в json_decode передать вторым параметром true:
Теперь мы получили обычный массив. Таким образом разобрались как работать с функцией json_decode для декодирования строки формата JSON.
Обработка ошибок
В случае ошибки, эти функции просто молча возвращают null.
Мы можем проверить, что нам вернулось null и посмотреть какая произошла ошибка следующим образом:
Иногда нам может быть полезно не молчаливо возвращать null, а выкинуть Exception и обработать его. PHP >7.3 предоставляет нам такую возможность.
Это можно сделать при помощи флага JSON_THROW_ON_ERROR
Теперь результат этого кода JsonException с сообщением Syntax error
Более подробно про обработку ошибок JSON:
Как вывести JSON ответ на ajax запрос
Когда к нашему PHP скрипту обращается например javascript с ajax запросом, для того, чтобы подгрузить на страницу новые данные, то часто возникает необходимость ответить в формате JSON.
Для того, чтобы это сделать, нужно отправить заголовок Content-type:application/json;charset=utf-8 и просто вывести строку с закодированными данными.
Содержимое файла text_json.php
Тем временем в javascript мы можем обратиться к нашему php скрипту таким образом:
Отправка JSON запросов на другой сервер.
Некоторые интернет сервисы принимает запросы в формате JSON. Давайте рассмотрим простой пример как отправить такой запрос.
Решение типовых проблем с json_encode (PHP)
Это краткая статья о наиболее вероятных проблемах с json_encode и их решениях. Иногда при кодировании данных в json, с помощью json_encode в php, мы получаем не тот результат который ожидаем. Я выделил три наиболее частые проблемы с которыми сталкиваются программисты:
Доступ к полям
Проблема заключается в том что json_encode имеет доступ только к публичным полям объекта. Например если у вас есть класс
то результатом выполнения следующего кода будет:
как видно в результирующий json были включены только публичные поля.
Что же делать если нужны все поля?
Решение
Для php = 5.4:
достаточно будет реализовать интерфейс JsonSerializable для нашего класса, что подразумевает добавление метода jsonSerialize который будет возвращать структуру представляющую объект для json_encode
Теперь мы можем использовать json_encode как и раньше
Почему не стоит использовать подход с toJson методом?
Многие наверно заметили что подход с созданием метода возвращающего json может быть использован и в версиях php >= 5.4. Так почему же не воспользоваться им? Все дело в том что ваш класс может быть использован как часть иной структуры данных
и результат уже будет совсем другой.
Также класс может использоваться другими программистами, для которых такой тип получение json-а с объекта может быть не совсем очевиден.
Что если у меня очень много полей в класcе?
В таком случае можно воспользоваться функцией get_object_vars
А если нужно private-поля, из класса, который нет возможности редактировать?
Может получиться ситуация когда нужно получить private поля (именно private, т.к. доступ к protected полям можно получить через наследование) в json-е. В таком случае необходимо будет воспользоваться рефлексией:
Кодировка текстовых значений
Кириллица и другие знаки в UTF8
Второй тип распространённых проблем с json_encode это проблемы с кодировкой. Часто текстовые значения которые нужно кодировать в json имеют в себе символы в UTF8 (в том числе кириллица) в результате эти символы будут представлены в виде кодов:
Отображение таких символов лечится очень просто — добавлением флага JSON_UNESCAPED_UNICODE вторым аргументом к функции json_encode:
Символы в других кодировках
Функция json_encode воспринимает строковые значения как строки в UTF8, что может вызвать ошибку, если кодировка другая. Рассмотрим маленький кусочек кода (данный пример кода максимально упрощен для демонстрации проблемной ситуации)
На первый взгляд ничего не предвещает проблем, да и что здесь может пойти не так? Я тоже так думал. В подавляющем большинстве случаев все будет работать, и по этой причине поиск проблемы занял у меня несколько больше времени, когда я впервые столкнулся с тем что результатом json_encode было false.
Как можно увидеть из ошибки: проблема с кодировкой переданной строки (это не UTF8). Решение проблемы очевидное — привести значение в UTF8
Цифровые значения
Последняя типовая ошибка связана с кодированием числовых значений.
Как известно php не строго типизированный язык и позволяет использовать числа в виде строки, в большинстве случаев это не приводит к ошибкам внутри php приложения. Но так как json очень часто используется для передачи сообщений между приложениями, такой формат записи числа может вызвать проблемы в другом приложении. Желательно использовать флаг JSON_NUMERIC_CHECK:
Уже лучше. Но как видим «3.0» превратилось в 3, что в большинстве случаев будет интерпретировано как int. Используем еще один флаг JSON_PRESERVE_ZERO_FRACTION для корректного преобразования в float:
Прошу также обратить внимание на следующий фрагмент кода, что иллюстрирует ряд возможных проблем с json_encode и числовыми значениями:
Спасибо за прочтение.
Буду рад увидеть в комментариях описание проблем, с которыми вы сталкивались, что не были упомянуты в статье