Formatuj, waliduj i minifikuj JSON.
Przewodnik po JSON
JSON (JavaScript Object Notation) is a lightweight data exchange format that has become a standard in modern programming.Jest łatwy do czytania i pisania dla ludzi oraz łatwy do przetwarzania i generowania dla maszyn. JSON jest niezależny od języka programowania, co czyni go idealnym do komunikacji między różnymi systemami i aplikacjami internetowymi.
Struktura JSON opiera się na parach klucz-wartość i uporządkowanych listach wartości.Obiekty JSON ujmuje się w nawiasy klamrowe {} i zawierają zero lub więcej par klucz:wartość, oddzielonych przecinkami.Tablice JSON ujmuje się w nawiasy kwadratowe [] i zawierają uporządkowaną listę wartości.Wartościami mogą być łańcuchy znaków (w cudzysłowach), liczby, wartości logiczne (true/false), null, obiekty lub tablice.
Formatowanie JSON poprawia czytelność kodu.Dodanie wcięć i podziału na wiersze sprawia, że struktura danych jest bardziej przejrzysta, co jest nieocenione podczas debugowania i analizy danych. Minifikacja (usunięcie białych znaków) zmniejsza rozmiar pliku, co ma znaczenie dla wydajności aplikacji internetowych, zwłaszcza przy przesyłaniu danych przez sieć.
Walidacja JSON to kluczowy krok przed przetwarzaniem danych.Nieprawidłowy JSON może powodować błędy aplikacji i nieoczekiwane zachowanie. Typowe problemy to brakujące przecinki, nieprawidłowe cudzysłowy, przecinki na końcu list lub użycie apostrofów zamiast cudzysłowów. Narzędzia walidacyjne pomagają szybko znaleźć i naprawić błędy.
Wyniki mają charakter informacyjny. Potwierdź je w innych źródłach.
JSON z powtórzonym kluczem parsuje się bez błędu i wyrzuca dwie wartości
Sparsuj {"id": 1, "id": 2, "id": 3}, a dostaniesz {"id": 3}. Bez błędu, bez ostrzeżenia — wygrywa ostatnie wystąpienie, a wcześniejsze znikają. Specyfikacja na to pozwala, każdy popularny parser tak robi, i oznacza to, że zdublowany klucz w pliku konfiguracyjnym nie jest błędem składni, o którym ktoś ci powie.
Jak to działa
- Formatuje i sprawdza JSON, wskazując pozycję błędu składni, a nie tylko to, że jakiś istnieje.
- Minifikuje do transportu i wcina do czytania, a to różne zadania na tych samych danych.
- Uwidacznia problemy strukturalne, które parser przyjmuje w milczeniu.
zdublowane klucze → wygrywa ostatnie wystąpienie, po cichu liczby całkowite powyżej 2⁵³ − 1 → zaokrąglane przy parsowaniu, po cichu NaN oraz Infinity → null undefined w obiekcie → klucz znika undefined w tablicy → null BigInt → rzuca TypeError
Przykład z liczbami
Trzy rzeczy, które parser robi z poprawnym JSON-em, nie zgłaszając zastrzeżeń.
- {"id": 1, "id": 2, "id": 3} → {"id": 3}
- {"id": 9007199254740993} → {"id": 9007199254740992}
- {"id": 1770000000123456789} → {"id": 1770000000123456800}
- {a: undefined, b: 1} → {"b": 1} — klucz przepada
- [undefined, 1] → [null, 1] — ale tutaj staje się null-em
Ta sama wartość undefined jest usuwana wewnątrz obiektu i zachowywana jako null wewnątrz tablicy. Żadna z tych sytuacji nie daje błędu, i dlatego wychodzą na jaw znacznie później jako brakujące pole albo identyfikator, który przestał do czegokolwiek pasować.
Jak czytać wynik
- Duże identyfikatory to przypadek najbardziej szkodliwy. Dziewiętnastocyfrowy identyfikator przechodzi przez JSON.parse jako nieco inna liczba, więc wyszukiwanie zawodzi wobec bazy, która zapisała oryginał. Przesyłaj takie identyfikatory jako ciągi znaków — dokładnie dlatego duże API zwracają id oraz id_str obok siebie.
- JSON nie ma komentarzy, nie dopuszcza przecinka na końcu i nie ma typu daty. Daty przetrwają wyłącznie jako ciągi ISO na mocy konwencji, więc obieg przez JSON zamienia Date w tekst i nie zamieni go z powrotem bez jawnej obsługi.
- Wcięcia kosztują więcej, niż ludzie sądzą: przykładowe dane rosną tu o 84,7% po sformatowaniu dwoma spacjami. Formatuj dla ludzi, którzy to czytają, i minifikuj wszystko, co przechodzi przez sieć, bo różnica jest bliska dwukrotności.
- Kolejność kluczy zachowuje każda licząca się implementacja, ale specyfikacja tego nie gwarantuje. Poleganie na niej działa, dopóki nie przestanie, a porównywanie dwóch dokumentów JSON przez równość ciągów zgłosi różnice, które są wyłącznie kwestią kolejności.
Częste pytania
- Dlaczego mój identyfikator zmienił się po obiegu przez JSON?
- Bo przekroczył 2⁵³ − 1 i został zaokrąglony do najbliższej reprezentowalnej wartości. 1770000000123456789 wraca jako 1770000000123456800. Rozwiązaniem jest przenoszenie dużych identyfikatorów jako ciągów znaków, bo żadna staranność w parserze nie odzyska już utraconych cyfr.
- Czy zdublowany klucz to niepoprawny JSON?
- Nie. Specyfikacja na to pozwala, a parsery rozstrzygają to, zachowując ostatnie wystąpienie. Czyni to realne zagrożenie w ręcznie edytowanej konfiguracji, gdzie powtórzony klucz po cichu nadpisuje wcześniejsze ustawienie, a nic nie zgłasza konfliktu.