编程

在 Laravel 中读取 JSON 文件

830 2024-09-07 02:02:00

介绍

构建 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::jsonStorage::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::jsonFile::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::jsonStorage::json 方法读取 JSON 文件。