Обработка экранированных косых черт в строке JSON
Я пытаюсь получить JSON базы данных, и код выглядит так
$path["file_name"] = "www.119.com\/assets\/demo\/large\/".$row["file_name"];
Пока я конвертирую в объект json и он показывает вот так.
www.119.com\\\/assets\\\/demo\\\/large\\\/demo1.png
Я только что подал заявку \
напечатать специальный символ /
, но это не работает. Я применил много вещей, чтобы напечатать специальный символ. Это проблема при преобразовании специального символа в JSON?
2 ответа
Как уже упоминалось другими, косая черта не является специальным символом внутри строки, в PHP или в Javascript (и, поскольку JSON является производным от Javascript, он следует тем же правилам для интерполяции строк). Однако, если вы читали какой-то JSON, вы могли бы подумать, что это так (хотя вы всегда должны RTM;-)).
Причина, по которой вы думаете, что вам нужно избежать косой черты, заключается в тонкой разнице в способе, которым PHP и Javascript интерполируют лишние косые черты. Рассмотрим следующее строковое объявление, допустимое как в PHP, так и в Javascript:
"AC\/DC"
В PHP дополнительная обратная косая черта рассматривается как литерал, поэтому:
echo "AC\/DC"; // outputs AC\/DC
В Javascript дополнительная обратная косая черта удалена, поэтому:
console.log("AC\/DC"); // logs AC/DC
JSON требует экранирования от косой черты, но json_encode()
позабочусь об этом побег для вас. Вам не нужно добавлять обратную косую черту в строку самостоятельно. И из-за разницы в способе интерполяции этих дополнительных обратных наклонных черт вы не можете просто взять строку JSON и перенести ее в ваш источник PHP - потому что она будет интерпретироваться как другое значение.
Начиная с PHP 5.4.0 вы можете предоставить JSON_UNESCAPED_SLASHES
флаг для json_encode()
в PHP, чтобы предотвратить добавление обратной косой черты. Однако это не является необходимым и может привести к тому, что строгий анализатор JSON отклонит данные.
Итак, чтобы подвести итог, правильный способ объявить вашу строку в PHP:
$path["file_name"] = "www.119.com/assets/demo/large/".$row["file_name"];
Как примечание, вы, вероятно, также, что включить http://
в начале строки и прохода $row['file_name']
через urlencode()
также, поскольку данные представляются в виде URL:
$path["file_name"] = "http://www.119.com/assets/demo/large/".urlencode($row["file_name"]);
Не должно быть необходимости избегать косой черты, поскольку она не считается специальным символом.
Возможно, вам придется заменить / на //, так как некоторые системы удаляют одну косую черту, когда она анализируется / отображается, на ум приходят окна.