PHP экранирование строки HTML внутри JSON

0

Я использую Slim php framework с базой данных, содержащей сложный HTML-контент, но при вызове метода get он возвращает плохой json. Здесь код возврата

$response->withJson($resp, 201); 

Я также пытался использовать json_encode, но все еще недействителен:

$response->withJson(json_encode($resp), 201);

Я только заметил, что в конце JSON отсутствует '}]', возможно ли, что контент слишком длинный для передачи в виде строки? Также когда я вызываю var_dump($resp) он правильно показывает мой контент

  • 0
    поскольку он пытается кодировать html в строки, " символы в html, вероятно, вызывают проблему, попробуйте включить параметр JSON_HEX_QUOT в качестве параметра $ encodingOptions в $response->withJson(); то есть что-то вроде $response->withJson($resp,201,JSON_HEX_QUOT);
  • 0
    Из любопытства ... Что значит "возвращает плохого JSON"?
Показать ещё 11 комментариев
Теги:
slim

5 ответов

1
Лучший ответ

Если вам не хватает }] в конце, то один из ваших файлов PHP имеет два пробела (или новые строки) до открытия <?php.

Другим решением является замена вашего $app->run() на:

$response = $app->run(true); //Silent mode, wont send the response
$response = $response->withoutHeader("Content-Length"); //Remove the Content-Length
$app->respond($response); //Now we send the response

Надеюсь, у нас будет правильное исправление в следующей версии!

  • 0
    Довольно хороший момент. Из любопытства, должен ли полный ответ отображаться на панели сети браузера или он полностью отбрасывается?
  • 0
    Я не знаю - я склонен использовать локон!
0

Что вы, скорее всего, захотите.

  1. Рендеринг HTML возможен с помощью slim/php-view или slim/twig-view
  2. Используйте AJAX, чтобы вытащить HTML и поместить его в свое мобильное приложение.

Использование JSON является глупым, так как вы все еще должны отображать на стороне сервера HTML, а затем упаковывать его в формат JSON. Выполнение этого, как правило, плохой идеи, поскольку JSON в спецификации будет принимать только UTF-8, и нет никакого способа обойти это.

  • 0
    Ему может потребоваться включить метаданные или сделать что-то столь же простое, как получение нескольких элементов одновременно (простой HTML-ответ подразумевает одно HTTP-соединение на элемент). Наличие чистого JSON API не обязательно чепуха. Но кроме этого, я думаю, что это должно было быть опубликовано как комментарий, а не как ответ. Когда у вас есть проблемы с вашим кодом, вы просто исправляете его, а не выкидываете весь дизайн.
0

Может быть, проблема с кодировкой символов. Вы пробовали это?

json_encode($array, JSON_UNESCAPED_UNICODE)

Любой способ вернуть PHP 'json_encode' с кодировкой UTF-8, а не Unicode?

  • 0
    Итак ... Исправление ядра Slim для вставки необработанных символов UTF-8 (а не простого 7-битного ASCII) исправит «плохой JSON»? Как именно?
0

Поскольку он пытается кодировать html в строки в JSON, " символы в html, вероятно, вызывают проблему. Попробуйте включить параметр JSON_HEX_QUOT в качестве третьего параметра.

$response->withJson($resp,201,JSON_HEX_QUOT);

Это позволит избежать " символа в html в \u0022 unicode \u0022, предотвращая столкновения.

  • 0
    Если вы посмотрите исходный код Slim, то увидите, что у него нет собственного JSON-кодера; withJson() - это чуть больше, чем вызов нативного json_encode() который - я могу вам сказать по опыту - работает правильно, особенно. с чем-то простым, как двойная кавычка.
  • 0
    Я только что попробовал ваше решение, но проблема все та же.
Показать ещё 1 комментарий
0

Насколько я могу судить, Slim не заботится о проверке ошибок:

/**
 * Json.
 *
 * Note: This method is not part of the PSR-7 standard.
 *
 * This method prepares the response object to return an HTTP Json
 * response to the client.
 *
 * @param  mixed  $data   The data
 * @param  int    $status The HTTP status code.
 * @param  int    $encodingOptions Json encoding options
 * @return self
 */
public function withJson($data, $status = 200, $encodingOptions = 0)
{
    $body = $this->getBody();
    $body->rewind();
    $body->write(json_encode($data, $encodingOptions));

    return $this->withStatus($status)->withHeader('Content-Type', 'application/json;charset=utf-8');
}

... так что вам нужно сделать это самостоятельно. Голый минимум - это вызов json_last_error().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню