Как убрать обратную косую черту в функции json_encode()?
Как убрать (\) обратный слеш на строку? когда используешь echo json_encode() ?
This is a test!\")"; echo json_encode($str); ?>
примечание: при выводе $str проблем не будет. но при выводе с помощью json_encode() , (\) обратный слеш появится.
Есть ли способ решить это? Спасибо.
12 ответов
json_encode($response, JSON_UNESCAPED_SLASHES);
Начиная с PHP 5.4 существуют константы, которые могут быть использованы json_encode() отформатировать ответ JSON, как вы хотите.
Для удаления обратной косой черты используйте: JSON_UNESCAPED_SLASHES , Вот так:
json_encode($response, JSON_UNESCAPED_SLASHES);
Посмотрите документацию PHP для получения дополнительных констант и дополнительной информации:
Если вы используете PHP 5.2, json_encode ожидает только 1 параметр при вызове. Это альтернатива unescape-слешу значений json:
stripslashes(json_encode($array))
Не используйте его, если ваши данные сложны.
Решение, которое действительно работает, это:
Однако вы должны быть здесь очень осторожны, потому что вам нужно убедиться, что все ваши значения имеют свои кавычки, которые экранированы (что в общем случае верно, но особенно теперь, когда вы удалите все экранированные символы из идиотского (и дисфункционального) помощника PHP «». «функциональность добавления ненужных обратных слешей перед всеми вашими объектными идентификаторами и значениями).
Таким образом, php по умолчанию дважды экранирует ваши значения, в которых есть кавычка, так что если у вас есть значение My name is «Joe» в вашей БД php вернет это как My name is \\»Joe\\» ,
Это может или не может быть полезным для вас. Если это не так, вы можете сделать дополнительный шаг, чтобы заменить начальный слеш там следующим образом:
да. это уродливо. но это работает.
Затем вы остаетесь с чем-то, что смутно напоминает настоящий JSON.
Я только что понял, что json_encode спасается только \n если он используется в одинарных кавычках.
echo json_encode("Hello World\n"); // results in "Hello World\n"
echo json_encode('Hello World\n'); // results in "Hello World\\\n"
$mystring = json_encode($my_json,JSON_UNESCAPED_SLASHES);
Как сказал HungryDB, более простой способ сделать это:
$mystring = json_encode($my_json,JSON_UNESCAPED_SLASHES);
Посмотрите на вашу версию PHP, потому что этот параметр был добавлен в версии 5.4.0
Как бороться с обратной косой чертой в JSON-строки PHP
Кажется, есть странность с json_encode и/или json_decode при попытке декодирования строки, созданной json_encode:
$object = new stdClass; $object->namespace = 'myCompany\package\subpackage'; $jsonEncodedString = json_encode($object); echo $jsonEncodedString; // Result of echo being: // $anotherObject = json_decode($jsonEncodedString); echo $anotherObject->namespace; // Result of echo being: // myCompany\package\subpackage $yetAnotherObject = json_decode(''); // Result should be: // myCompany\package\subpackage // But returns an invalid string sequence error instead. echo json_last_error_msg();
Я никогда не испытывал проблемы до этого, так как мне никогда не приходилось захватывать строку с обратными косыми чертами до сегодняшнего дня. При рассмотрении вышеприведенного кода я могу кодировать/декодировать, используя встроенные компоненты PHP. Однако, если я попытаюсь декодировать строку, созданную этим кодировщиком, я получаю сообщение об ошибке. Я читал в таких документах, как «» Предопределенные константы» и другие вопросы в стеке, такие как «как удалить обратную косую черту ( «\» ) в ответ json с помощью php?». Но я не могу найти причину ПОЧЕМУ я не могу декодировать строку, созданную json_encode. Версия PHP, которую я использую для тестирования этого кода, составляет 5.5.9. Я знаю, что я мог бы быть совершенно незнакомым из-за отсутствия чего-то, но должен ли я обрабатывать свою строку, созданную json_encode по-другому, если я попытаюсь использовать ее в другом месте?
4 ответа
$jsonEncodedString = json_encode($object); echo $jsonEncodedString; // Result of echo being: //
$yetAnotherObject = json_decode('');
Обратная косая черта ( \ ) является специальным символом как в PHP, так и в JSON. Оба языка используют его для исключения специальных символов в строках и для того, чтобы правильно представлять обратную косую черту в строках, вам нужно добавить еще одну обратную косую черту в PHP и JSON. Попробуйте выполнить работу парсера PHP в строке выше. После открытой круглой скобки встречается строка заключенная в одинарные кавычки. Есть два специальных символа, которые нужно экранировать в строках одиночной кавычки: апостроф ( ‘ ) и обратная косая черта ( \ ). В то время как апостроф всегда нуждается в экранировании, интерпретатор PHP прощает и позволяет избежать обратного слэша, если не создает путаницы. Однако правильное представление обратной косой черты внутри одиночных кавычек строк \\ . Строка, переданная функции json_decode() , есть
Обратите внимание, что это точный список символов, обработанных во время выполнения, а не строка, представленная на PHP или на любом другом языке. Языки имеют специальные правила для представления специальных символов. Это просто текст. Текст выше интерпретируется функцией json_decode() , которая ожидает, что она будет частью JSON . JSON — небольшой язык, он имеет специальные правила для кодирования специальных символов в строках. Обратная косая черта является одним из этих символов, и когда она появляется в строке, она должна быть добавлена другой обратной косой чертой. JSON не прощает; когда он встречает обратную косую черту, он всегда рассматривает его как escape-символ для следующего символа в строке. Объект, созданный json_decode() после успешного анализа представленного вами JSON-представления, содержит одно свойство с именем namespace , значение которого:
myCompany\package\subpackage
Что пошло не так?
$yetAnotherObject = json_decode('');
Парсер PHP интерпретирует код выше, используя правила PHP. Он понимает, что функция json_decode() должна быть вызвана с текстом <"namespace":"myCompany\package\subpackage">в качестве аргумента. json_decode() использует свои правила и пытается интерпретировать текст выше как часть представления JSON. Цитата ( » ) перед myCompany сообщает, что «myCompany\package\subpackage» должен анализироваться как строка. Обратная косая черта перед package интерпретируется как escape-символ для p , но \p не является допустимой escape-последовательностью для строк в JSON. Вот почему он отказывается продолжать и возвращает NULL .
How to remove backslash on json_encode() function?
You can use the JSON_UNESCAPED_SLASHES option in the json_encode() function to prevent backslashes from being added to the JSON string.
// Define an array of data to encode as JSON $data = [ 'name' => 'John Doe', 'age' => 30, 'email' => '[email protected]', ]; // Encode the array as a JSON string, with slashes unescaped $json = json_encode($data, JSON_UNESCAPED_SLASHES); // Output the resulting JSON string echo $json;
// Define an array of data to encode as JSON $data = [ 'name' => 'John Doe', 'age' => 30, 'email' => '[email protected]', 'favorite_quotes' => [ "We can't solve problems by using the same kind of thinking we used when we created them. - Albert Einstein", "The greatest glory in living lies not in never falling, but in rising every time we fall. - Nelson Mandela", ], ]; // Encode the array as a JSON string, with Unicode escape sequences replaced $json = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); $json = preg_replace_callback( '/\\\\u([a-f0-9])/i', function ($match) < return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE'); >, $json ); // Output the resulting JSON string echo $json;
Как удалить обратную косую черту в функции json_encode ()?
Как удалить (\) обратную косую черту в строке? при использовании echo json_encode() ?
php $str = "$(\"#output\").append(\"This is a test!
\")"; echo json_encode($str); ?>
note: Когда вы эхом $ str, проблем не будет … но когда вы эхом используете json_encode() , появится обратная косая черта (\) .
Есть ли способ решить это? Спасибо.
json_encode($response, JSON_UNESCAPED_SLASHES);
Начиная с PHP 5.4 существуют константы, которые могут использоваться json_encode() для форматирования ответа json, как вы хотите.
Чтобы удалить обратную косую черту, используйте: JSON_UNESCAPED_SLASHES . Вот так:
json_encode($response, JSON_UNESCAPED_SLASHES);
Просмотрите документацию PHP для получения дополнительных констант и дополнительной информации:
решение, которое работает, таково:
Однако вы должны быть предельно осторожны, потому что вам нужно убедиться, что все ваши значения не имеют кавычек (что в общем случае верно в любом случае, но тем более теперь, когда вы будете лишать всех побегов от идиотского (и дисфункционального) PHP-хелпера «функциональность добавления ненужных обратных косых черт перед всеми вашими идентификаторами объектов и значениями).
Таким образом, php, по умолчанию, удваивает escape-значения ваших значений, у которых есть цитата в них, поэтому, если у вас есть значение My name is «Joe» в вашей БД, php вернет его, так как My name is \\»Joe\\» .
Это может быть или не быть полезным для вас. Если это не так, вы можете сделать дополнительный шаг по замене ведущей косой черты следующим образом:
да … это уродливо … но это работает.
Затем вы остаетесь с чем-то, что смутно напоминает настоящий JSON.
$mystring = json_encode($my_json,JSON_UNESCAPED_SLASHES);
Как сказал HungryDB, более простой способ сделать это:
$mystring = json_encode($my_json,JSON_UNESCAPED_SLASHES);
Взгляните на версию php, поскольку этот параметр был добавлен в версию 5.4.0
Я просто понял, что json_encode делает только escape \n если он используется в одинарных кавычках.
echo json_encode("Hello World\n"); // results in "Hello World\n"
echo json_encode('Hello World\n'); // results in "Hello World\\\n"
Вы не хотите его удалять. Поскольку JSON использует двойные кавычки «» для строк, а ваш возвращается
"$(\"#output\").append(\" This is a test!\")"
эти обратные косые черты избегают этих котировок
Я использую следующее, чтобы удалить косые черты
echo json_decode($mystring, JSON_UNESCAPED_SLASHES);
Если вы используете PHP 5.2, json_encode просто ожидает только 1 параметр при вызове. Это альтернатива unescape slash значений json:
stripslashes(json_encode($array))
Не используйте его, если ваши данные сложны.