Я использую Slim php framework с базой данных, содержащей сложный HTML-контент, но при вызове метода get он возвращает плохой json. Здесь код возврата
$response->withJson($resp, 201);
Я также пытался использовать json_encode, но все еще недействителен:
$response->withJson(json_encode($resp), 201);
Я только заметил, что в конце JSON отсутствует '}]', возможно ли, что контент слишком длинный для передачи в виде строки? Также когда я вызываю var_dump($resp)
он правильно показывает мой контент
Если вам не хватает }]
в конце, то один из ваших файлов 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
Надеюсь, у нас будет правильное исправление в следующей версии!
Что вы, скорее всего, захотите.
slim/php-view
или slim/twig-view
Использование JSON является глупым, так как вы все еще должны отображать на стороне сервера HTML, а затем упаковывать его в формат JSON. Выполнение этого, как правило, плохой идеи, поскольку JSON в спецификации будет принимать только UTF-8, и нет никакого способа обойти это.
Может быть, проблема с кодировкой символов. Вы пробовали это?
json_encode($array, JSON_UNESCAPED_UNICODE)
Любой способ вернуть PHP 'json_encode' с кодировкой UTF-8, а не Unicode?
Поскольку он пытается кодировать html в строки в JSON, "
символы в html, вероятно, вызывают проблему. Попробуйте включить параметр JSON_HEX_QUOT в качестве третьего параметра.
$response->withJson($resp,201,JSON_HEX_QUOT);
Это позволит избежать "
символа в html в \u0022
unicode \u0022
, предотвращая столкновения.
withJson()
- это чуть больше, чем вызов нативного json_encode()
который - я могу вам сказать по опыту - работает правильно, особенно. с чем-то простым, как двойная кавычка.
Насколько я могу судить, 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().
"
символы в html, вероятно, вызывают проблему, попробуйте включить параметрJSON_HEX_QUOT
в качестве параметра $ encodingOptions в$response->withJson();
то есть что-то вроде$response->withJson($resp,201,JSON_HEX_QUOT);