• Czas czytania ~4 min
  • 20.04.2023

Wprowadzenie

Może się zdarzyć, że podczas tworzenia aplikacji Laravel będziesz musiał odczytać plik JSON.

Często zdarzało mi się, że muszę to zrobić, gdy piszę testy integracji API i chcę przeczytać fikcyjną odpowiedź, którą wcześniej zapisałem w pliku JSON. Musiałem to również zrobić, gdy pracowałem z usługami innych firm (takimi jak Firebase), które udostępniają plik JSON, który można przekazać do zestawu SDK w celu uwierzytelnienia.

W tym artykule Quickfire szybko omówimy, jak korzystać z nowej File::json metody, która została dodana w Laravel 10.4 przez Austina White'a w PR # 46481. Omówimy również, jak korzystać z podobnej Storage::json metody, która została dodana w Laravel 10.5 przez lorenzolosa w PR # 46548.

Następnie szybko porównamy różnice między tymi dwiema metodami i sposoby poprawy obsługi błędów.

Odczytywanie plików JSON za pomocą fasady

"Plik" Metoda File::json jest prostym opakowaniem wokół json_decode funkcji i File::get metody. Umożliwia odczyt pliku JSON z lokalnego systemu plików i zwrócenie zawartości jako tablicy.

Wcześniej, jeśli chciałeś odczytać plik JSON w aplikacji Laravel, możesz zrobić coś takiego:

$contents = File::get(base_path('path/to/file.json'));
$json = json_decode($contents);

Zakładając, że plik JSON jest prawidłowy, zmienna $json będzie teraz tablicą zawierającą zawartość pliku JSON.

Załóżmy na przykład, że plik JSON zawiera następujące dane:Zmienna $json będzie teraz zawierać następujące dane tablicowe:Możemy osiągnąć dokładnie to samo zachowanie, używając nowej File::json metody w następujący sposób:

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ]
}

[
    'name' => 'laravel/laravel',
    'type' => 'project',
    'description' => 'The Laravel Framework.',
    'keywords' => [
        'framework',
        'laravel',
    ],
]

$json = File::json(base_path('path/to/file.json'));

Chociaż jest to niewielka zmiana, bardzo mi się podoba!

Jestem wielkim fanem prób uczynienia mojego kodu czytanym tak blisko zwykłego angielskiego, jak to tylko możliwe, i czuję, że ta metoda pomaga w tym. Ilekroć piszę jakiś kod, staram się myśleć sobie: "Czy junior dołączający do zespołu byłby w stanie zrozumieć, co się dzieje?".

Oczywiście ta jedna mała zmiana nie sprawi, że twój kod będzie magicznie czytelny dla wszystkich, ale myślę, że to małe zmiany, takie jak te, dają marginalne zyski w czasie.

Odczytywanie plików JSON za pomocą fasady

"Storage" Podobnie jak File::json metoda, Laravel ma również metodęStorage::json, której można użyć do odczytu plików JSON.

File::json Podczas gdy metoda może być używana do odczytu plików JSON z dowolnego miejsca w lokalnym systemie plików, Storage::json metoda może być używana do odczytu plików z dysku pamięci masowej aplikacji. W rezultacie oznacza to, że możesz używać Storage::json do odczytu plików z zasobnika AWS S3, Digital Ocean Spaces i tak dalej.

Możesz wywołać metodę dokładnie w taki sam sposób, jak metodaFile::json:

$json = Storage::json('path/to/file.json');

Obsługa błędów

różnych zachowań dla nieistniejących plików

W chwili pisania tego artykułu ważne jest, aby pamiętać, że File::json i Storage::json mają nieco inne zachowanie, jeśli chodzi o radzenie sobie z nieistniejącymi plikami.

Jeśli spróbujesz odczytać nieistniejący plik za pomocą tej File::json metody, zgłosi Illuminate\Contracts\Filesystem\FileNotFoundException wyjątek. Jeśli jednak spróbujesz odczytać nieistniejący plik za pomocą tej Storage::json metody, zwróci nullon plik .

Jest to coś, o czym należy pamiętać podczas korzystania z tych metod i podejmowania decyzji o najlepszym podejściu do obsługi błędów.

Odczytywanie nieprawidłowych plików

JSON Przed próbą użycia pliku JSON należy zawsze pamiętać o sprawdzeniu poprawności zawartości pliku JSON.

Załóżmy, że masz następujący nieprawidłowy plik JSON (który ma końcowy przecinek w przedostatnim wierszu, aby spowodować błąd):

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
}

Jeśli spróbujesz użyć Storage::json lub File::json odczytać ten plik, obie te metody zwrócą null. Dzieje się tak, ponieważ funkcja powrócinull, json_decode jeśli nie będzie w stanie zdekodować ciągu JSON.

Wynika to z faktu, że podstawowa json_decode metoda używa 0 (JSON_ERROR_NONE) jako domyślnej flagi, co oznacza, że po cichu zawiedzie, jeśli napotka błąd.

Zazwyczaj wolę wyjątek, jeśli wystąpi błąd, więc jestem zmuszony sobie z nim poradzić. Gwarantuje, że nie będę używać nieprawidłowych danych w mojej aplikacji i może powiadomić mnie o moim oprogramowaniu do śledzenia błędów, aby móc rozwiązać problem. Aby to zrobić, możesz przekazać flagę JSON_THROW_ON_ERROR do metod takich jak so:

$json = Storage::json('path/to/file.json', JSON_THROW_ON_ERROR);

$json = File::json('path/to/file.json', JSON_THROW_ON_ERROR);

Now, jeśli którakolwiek z tych metod nie jest w stanie zdekodować ciągu JSON, zostanie wygenerowanyJsonException.

Mamy

nadzieję, że ten artykuł Quickfire powinien dać ci szybki wgląd w to, jak możesz korzystać z nowych File::json metod Storage::json odczytu plików JSON w Laravel.

Jeśli podobał Ci się ten post, chciałbym o tym usłyszeć. Podobnie, jeśli masz jakieś opinie, aby ulepszyć przyszłe, chciałbym to również usłyszeć.

Możesz być także zainteresowany sprawdzeniem mojego 220+ stronicowego ebooka "Battle Ready Laravel", który obejmuje podobne tematy bardziej szczegółowo.

Jeśli jesteś zainteresowany otrzymywaniem aktualizacji za każdym razem, gdy publikuję nowy post, zapisz się do mojego biuletynu poniżej.

Buduj niesamowite rzeczy! 🚀

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297