Как использовать Laravel response () -> json () для возврата пустого объекта вместо пустого массива

В 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() для возврата пустой объект вместо пустой массив, возможно ли это?

Возможный дубликат Как определить пустой объект в PHP

DrNio 01.05.2018 10:27

@DrNio это не та проблема. см. мой код, уже определены данные объекта, но проблема заключается в использовании response () -> json () всегда возвращает пустой массив для данных.

kingshark 01.05.2018 10:42

Хм, ваш первый вариант тоже должен подойти, поскольку по умолчанию он использует json_encode. Если ваш ResponseFactory не возвращает JsonResponse по умолчанию. Не могли бы вы попробовать это: return response()->json($data, 200, [], JSON_FORCE_OBJECT);

vstm 01.05.2018 10:44
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
9
3
15 002
6

Ответы 6

Когда вы возвращаете 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": {}
}

Я получаю "{}" вместо только {}. Любая идея?

Jonjie 08.04.2020 20:35

Это работает:

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);

});

Другие вопросы по теме