如何返回格式化(漂亮)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","re​​member_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","re​​member_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","re​​member_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)的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将光标列表转换为JSON格式?

RESTful 响应如何在 Yii2 中返回 JSON 而不是 XML?

RESTful 响应如何在 Yii2 中返回 JSON 而不是 XML?

Python pprint | 超级好用的Python库,漂亮的打印,让json数据提取体验更好

如何从get请求获取json响应而不是html响应?

如何使用 Go 漂亮地打印 JSON?