在 Laravel 中读取 JSON 文件
介绍
构建 Laravel 应用时,有时可能需要读取 JSON 文件。
当为 API 集成编写测试时,我经常发现自己需要这样做,同时我想读取之前保存在 JSON 文件中的伪响应。当使用第三方服务(如 Firebase)时,我也需要这样做,这些服务为你提供 JSON 文件,以便传递给 SDK 进行身份验证。
在这篇文章中,我们将快速介绍如何使用 Laravel 10.4 中引入的 File::json
方法以及如何使用 Laravel 10. 5 中引入的类似的 Storage::json
方法。
然后,我们将快速比较这两种方法之间的差异以及如何改进错误处理。
使用 "File" Facade 读取JSON 文件
File::json
方法是 json_decode
函数和 File::get
方法的简单包装器。它允许从本地文件系统读取 JSON 文件,并将内容以数组方式返回。
以前,如果你想在 Laravel 应用中读取 JSON 文件,你可以这样做:
$contents = File::get(base_path('path/to/file.json'));
$json = json_decode(json: $contents, associative: true);
上面的代码示例首先打开 JSON 文件并尝试读取其内容。从 JSON 文件中获取数据后,我们将其传递给 json_decode
函数,将其转换为 PHP 关联数组。你可能还注意到,我们将 true
作为 json_decode
函数的 associative
参数传递。这样做是为了将 JSON 映射到关联数组。如果没有传递该值,JSON 将被转换为 PHP 对象。
假设文件有效并且我们可以解析其中 JSON,$json
变量现在将是一个包含 JSON 文件内容的数组。
例如,假设 JSON 文件包含以下数据:
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
]
}
$json
变量现在包含如下数组数据:
[
'name' => 'laravel/laravel',
'type' => 'project',
'description' => 'The Laravel Framework.',
'keywords' => [
'framework',
'laravel',
],
]
通过新增的 File::json
方法,我们可以达到同样的效果:
$json = File::json(base_path('path/to/file.json'));
使用 "Storage" Facade 读取JSON 文件
类似于 File::json
方法,Laravel 也有一个 Storage::json
方法可用于读取 JSON 文件。
File::json
方法可用于从本地文件系统上的任何位置读取 json 文件,而 Storage::json
法可用于从应用的存储磁盘读取文件。因此,这意味着您可以使用 Storage::json
从 AWS S3 存储桶、Digital Ocean Spaces 等读取文件。
你可以按照与 File::json
方法完全相同的方式调用该方法:
$json = Storage::json('path/to/file.json');
错误处理
文件不存在的不同行为
在撰写本文时,值得注意的是,在处理不存在的文件时,File::json
和 Storage::json
的行为略有不同。
如果尝试使用 File::json
方法读取不存在的文件,它将抛出 Illuminate\Contracts\Filesystem\FileNotFoundException
异常。但是,如果尝试使用 Storage::json
方法读取不存在的文件,它将返回 null
。
在使用这些方法和决定错误处理的最佳方法时,需要记住这一点。
读取无效的 JSON 文件
在尝试使用 JSON 文件之前,你必须始终记住验证其内容。
假设有以下无效的 JSON 文件(倒数第二行有一个逗号,会导致错误):
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
}
如果您尝试使用 Storage::json
或 File::json
读取此文件,这两种方法都将返回 null
。这是因为如果 json_decode
函数无法解码 json 字符串,它将返回 null
。
这是由于底层 json_decode
方法使用 0
(JSON_ERROR_NONE
)作为默认标志,这意味着如果遇到错误,它将自动失败。
通常,我更喜欢在出错时抛出异常,这样我就必须处理它。它确保我不会在应用中使用无效数据,并可以提醒我使用错误跟踪软件,以便我解决问题。为此,可以像下例这样将 JSON_THROW_ON_ERROR
标志传递给方法:
$json = Storage::json('path/to/file.json', JSON_THROW_ON_ERROR);
$json = File::json('path/to/file.json', JSON_THROW_ON_ERROR);
现在,如果这两个方法不能解码 JSON 字符串,将会抛出 JsonException
。
小结
希望这篇文章呢那个带你快速了解在 Laravel 中如何使用 File::json
和 Storage::json
方法读取 JSON 文件。