【问题标题】:How to return formatted(pretty) JSON instead of JSON? Or new line JSON instead of inline JSON?(Laravel)如何返回格式化(漂亮)JSON 而不是 JSON?还是换行 JSON 而不是内联 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。有点取决于你想用这个来完成什么。

标签: json laravel


【解决方案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);

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2017-08-02
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 2016-02-16
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多