В Laravel 5.5
Route::get('/test2', function (){
$data = (object) [];
return response()->json($data);
});
он всегда возвращает []
, а не {}
.
другой код:
Route::get('/test2', function (){
$data = (object) [];
return json_encode($data);
});
правильно возвращает {}
Я хочу использовать помощник response()->json()
для возврата пустой объект вместо пустой массив, возможно ли это?
@DrNio это не та проблема. см. мой код, уже определены данные объекта, но проблема заключается в использовании response () -> json () всегда возвращает пустой массив для данных.
Хм, ваш первый вариант тоже должен подойти, поскольку по умолчанию он использует json_encode
. Если ваш ResponseFactory
не возвращает JsonResponse
по умолчанию. Не могли бы вы попробовать это: return response()->json($data, 200, [], JSON_FORCE_OBJECT);
Когда вы возвращаете response()->json($data)
, он возвращает объект JsonResponse
, который включает $data
в поле data
. Поэтому, когда вы получаете этот ответ, вы получаете данные в том же формате (объект).
JsonResponse json(string|array $data = [], int $status = 200, array $headers = [], int $options)
Когда вы вернете json_encode($data)
, он проанализирует $data
и вернет строку: "{}"
. Только если вы декодируете "{}"
, он снова станет объектом.
string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )
Всем спасибо, наконец-то я нашел проблему: dingo/api
.
Если я использую response () -> json ($ data) в приложении с использованием пакета dingo/api
, существует другой процесс обработки ответов. В какой-то момент он пройдет через метод \Dingo\Api\Http\Response::makeFromJson
, который декодирует содержимое ответа, а затем создаст новый экземпляр ответа, который изменил {}
на []
.
Если я удалю или не использую пакет dingo/api
, response () -> json () может работать нормально, по крайней мере, в Laravel 5.5.
dingo/api override, change and extend large amount of laravel built-in classes and approach in the entire request life cycle, from route to response to exception handling.
Использование dingo / api изменяет ответ пустого массива, как сказал @kingshark, но вы можете сделать эту работу, не прекращая использование dingo или изменяя что-либо еще, кроме вашего собственного ответа.
Динго ожидает, что $ data уже закодированы как json, поэтому, если вы это сделаете:
$data = ['message' => 'Lorem Ipsum',
'errors' => []];
return response()->json($data);
Получите:
{
"message": "Lorem Ipsum",
"errors": []
}
Но если вы это сделаете:
$data = ['message' => 'Lorem Ipsum',
'errors' => []];
$data = json_encode($data, JSON_FORCE_OBJECT);
return response()->json($data);
Ты получишь:
{
"message": "Lorem Ipsum",
"errors": {}
}
Я получаю "{}" вместо только {}. Любая идея?
Это работает:
return response()->json(new stdClass());
Еще один пример, вдохновленный ответом Хамида Мохайеджи:
return \response()->json(null);
Нет необходимости создавать экземпляр stdClass
(хотя выделение памяти).
Это работает в Laravel 5.6
Route::get('/test2', function (){
$data = (object) [];
return response()->json($data, 200, [], JSON_FORCE_OBJECT);
});
Возможный дубликат Как определить пустой объект в PHP