如何返回格式化(漂亮)JSON 而不是 JSON?还是换行 JSON 而不是内联 JSON?(Laravel)
Posted
技术标签:
【中文标题】如何返回格式化(漂亮)JSON 而不是 JSON?还是换行 JSON 而不是内联 JSON?(Laravel)【英文标题】:How to return formatted(pretty) JSON instead of JSON? Or new line JSON instead of inline JSON?(Laravel) 【发布时间】:2022-01-21 17:24:25 【问题描述】:当从 laravel 路由或控制器返回数据时,它们会自动作为 JSON 数据返回。这很酷,但是将这些数据读入网页很困难。因为它们是内联的,并且很难识别元素。我知道我可以使用类似:https://jsonformatter.curiousconcept.com/#。将 json 数据格式化为可读。但我想知道这是否可以在 laravel 网络路由或控制器中完成?
下面的路由是 web.php 文件的一部分。还有use Illuminate\Support\Facades\DB;
。
Route::get('usersAsJson', function()
return DB::table('users')->limit(3)->get();
);
这会返回内联 JSON,如下所示:
["id":1,"name":"Winifred 格洛弗","email":"wkeebler@example.net","email_verified_at":"2021-12-15 13:22:29","密码":"$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi","remember_token":"aUEs6ZqylC","created_at":"2021-12-15 13:22:29","updated_at":"2021-12-15 13:22:29","id":2,"name":"伯纳丁 卡特","email":"michelle.terry@example.com","email_verified_at":"2021-12-15 13:22:29","密码":"$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi","remember_token":"RpXyMl9N8i","created_at":"2021-12-15 13:22:29","updated_at":"2021-12-15 13:22:29","id":3,"name":"罗伯塔 Brakus","email":"halle.heathcote@example.org","email_verified_at":"2021-12-15 13:22:29","密码":"$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi","remember_token":"SfEj3TUqbY","created_at":"2021-12-15 13:22:29","updated_at":"2021-12-15 13:22:29"]
我想要新的 JSON 格式:
[
"id":1,
"name":"Winifred Glover",
"email":"wkeebler@example.net",
"email_verified_at":"2021-12-15 13:22:29",
"password":"$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC\/.og\/at2.uheWG\/igi",
"remember_token":"aUEs6ZqylC",
"created_at":"2021-12-15 13:22:29",
"updated_at":"2021-12-15 13:22:29"
,
"id":2,
"name":"Bernadine Carter",
"email":"michelle.terry@example.com",
"email_verified_at":"2021-12-15 13:22:29",
"password":"$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC\/.og\/at2.uheWG\/igi",
"remember_token":"RpXyMl9N8i",
"created_at":"2021-12-15 13:22:29",
"updated_at":"2021-12-15 13:22:29"
,
"id":3,
"name":"Roberta Brakus",
"email":"halle.heathcote@example.org",
"email_verified_at":"2021-12-15 13:22:29",
"password":"$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC\/.og\/at2.uheWG\/igi",
"remember_token":"SfEj3TUqbY",
"created_at":"2021-12-15 13:22:29",
"updated_at":"2021-12-15 13:22:29"
]
【问题讨论】:
你需要一个 chrome 扩展。 chrome.google.com/webstore/detail/json-formatter/… - Laravel 以 text/json 的形式返回它,它是正确的,它只是你的浏览器呈现它。 作为替代方案,将您的呼叫包装在dd()
中,如dd(DB::table('users')->limit(3)->get());
将显示良好的格式,但不是JSON。有点取决于你想用这个来完成什么。
【参考方案1】:
如果您使用response()->json()
方法生成您的json响应,您可以在第四个参数中传入编码选项。
Route::get('usersAsJson', function()
return response()->json(DB::table('users')->limit(3)->get(), 200, [], JSON_PRETTY_PRINT);
);
如果您打算在很多地方这样做,我建议您定义一个新的response macro(例如prettyJson()
)并使用它来稍微清理一下代码。
将此添加到您的 AppServiceProvider::boot()
方法中:
Illuminate\Support\Facades\Response::macro('prettyJson', function ($data = [], $status = 200, array $headers = [], $options = 0)
return Illuminate\Support\Facades\Response::json($data, $status, $headers, JSON_PRETTY_PRINT | $options);
);
然后您可以在响应中使用新的prettyJson
方法,它会为您添加漂亮的打印选项(并且仍然保留原始json()
方法的所有其他功能):
Route::get('usersAsJson', function()
return response()->prettyJson(DB::table('users')->limit(3)->get());
);
【讨论】:
这就是我想要的。谢谢。【参考方案2】:取决于您使用什么来咨询端点,如果 postmant、firefox 或 google chrome,最重要的是,如果标题在 application/json
中有 Content-Type
类型
我倾向于使用
response()->json(DB::table('users')->limit(3)->get());
在邮递员
在火狐中
这在 Google Chrome 中不起作用(在我的设备中)。
【讨论】:
是的,我知道您可以使用 Postman 选择漂亮的 JSON。也在 Chrome 上使用一些扩展,也许在其他一些浏览器中。甚至使用一些在线格式化程序。但我想知道你是否可以用 laravel 做到这一点。这样你就不必担心在浏览器之间切换(如果它安装了漂亮的 JSON 扩展或没有)。这个想法是在离开服务器之前将服务器的响应格式化为漂亮的 JSON。而不是在客户端这样做。我不确定在从响应中捕获此数据之前是否使用了诸如“修剪空格”之类的方法,但我只是想知道。 你可以使用dump()
帮助器在抛出它之前在服务器端对其进行可视化,我倾向于将它与dump-server
一起使用,以免切断应用程序流程并查看它显示的内容
【参考方案3】:
https://www.php.net/manual/en/json.constants.php#constant.json-pretty-print
return json_decode(DB::table('users')->limit(3)->get(), JSON_PRETTY_PRINT);
【讨论】:
以上是关于如何返回格式化(漂亮)JSON 而不是 JSON?还是换行 JSON 而不是内联 JSON?(Laravel)的主要内容,如果未能解决你的问题,请参考以下文章
RESTful 响应如何在 Yii2 中返回 JSON 而不是 XML?
RESTful 响应如何在 Yii2 中返回 JSON 而不是 XML?