1. Czym jest JSON (JavaScript Object Notation)?
JSON (czytamy „dżejson”, a nie „żeson”!) to skrót od JavaScript Object Notation. Mimo słowa „JavaScript” w nazwie JSON jest uniwersalnym formatem, wspieranym przez praktycznie wszystkie języki programowania, w tym Javę.
JSON został opracowany przez Douglasa Crockforda na początku lat 2000 jako prosty sposób wymiany danych między przeglądarką a serwerem. Wcześniej dominował XML – rozwlekły i przeładowany znacznikami.
JSON okazał się bardziej kompaktowy, prostszy i łatwy do czytania „gołym okiem”. Szybko stał się standardem de facto wymiany danych między klientem i serwerem, zwłaszcza w aplikacjach webowych i mobilnych.
Dlaczego JSON stał się standardem?
- Prosta składnia – łatwo go pisać i czytać ręcznie.
- Kompaktowość – bez zbędnych znaczników i nadmiarowego balastu.
- Czytelność – nawet laik zrozumie, o co chodzi.
- Łatwość parsowania – większość języków ma wbudowane lub zewnętrzne biblioteki.
- Międzyjęzykowość – Java, Python, Kotlin itd. – JSON obsługują wszystkie.
- Standard dla REST API – zdecydowana większość API zwraca JSON.
Porównanie z XML
| JSON | XML | |
|---|---|---|
| Czytelność | Bardzo wysoka | Średnia (dużo znaczników) |
| Rozmiar | Kompaktowy | Bardziej rozbudowany |
| Parsowanie | Proste | Wymaga więcej wysiłku |
| Rozszerzalność | Obsługuje zagnieżdżanie | Obsługuje zagnieżdżanie |
| Formalizm | Mniej formalny | Można opisywać schematy |
| Popularność (2020+) | Bardzo wysoka | Używany, lecz rzadziej |
JSON wygrywa niemal w każdym punkcie. Niemniej jednak XML pozostaje aktualny tam, gdzie potrzebne są złożone schematy, ścisłe typowanie, walidacja względem XSD, wsparcie komentarzy i atrybutów – na przykład w starszych systemach i oprogramowaniu bankowym.
W praktyce, jeśli nie piszesz oprogramowania dla banku lub statku kosmicznego, – używaj JSON.
2. Podstawowa składnia JSON
Jeśli pracowałeś z obiektami JavaScript lub słownikami w innych językach, składnia wyda się znajoma. W Javie nie ma bezpośredniego „słownika”, jego rolę pełnią kolekcje z java.util, w pierwszej kolejności Map<K, V> (najczęściej – HashMap<K, V>).
Elementy podstawowe
- Obiekty – zbiory par „klucz: wartość”, ujęte w { }.
- Tablice – uporządkowane listy wartości, ujęte w [ ].
Przykład obiektu:
{
"name": "Alice",
"age": 25
}
Przykład tablicy:
[1, 2, 3, 4, 5]
Przykład obiektu z tablicą:
{
"students": [
"Ivan",
"Maria",
"John"
]
}
Dozwolone typy wartości
W JSON można używać tylko następujących typów danych:
| Typ | Przykład | Opis |
|---|---|---|
| Łańcuch | |
Zawsze w podwójnych cudzysłowach |
| Liczba | |
Całkowite i zmiennoprzecinkowe |
| Boolean | |
Wartości logiczne |
| null | |
„Pusto”, brak wartości |
| Obiekt | |
Zbiór par „klucz: wartość” |
| Tablica | |
Lista wartości |
Uwaga: klucze w obiektach to zawsze ciągi w podwójnych cudzysłowach, na przykład "name". Pojedyncze cudzysłowy są niedozwolone.
Przykłady poprawnego JSON
{
"id": 1,
"name": "Bob",
"active": true,
"scores": [10, 20, 30],
"profile": {
"email": "bob@example.com",
"phone": null
}
}
Przykład niepoprawnego JSON (błędy)
{
name: 'Bob', // Błąd: klucze i łańcuchy — tylko w podwójnych cudzysłowach!
age: 25,
}
3. Struktura danych: zagnieżdżanie obiektów i tablic
JSON obsługuje głębokie zagnieżdżanie: obiekty w obiektach, tablice w obiektach, obiekty w tablicach itd. To jak matrioszka.
Przykład złożonego dokumentu JSON
{
"university": "Java University",
"students": [
{
"name": "Ivan",
"age": 20,
"courses": ["Math", "Java", "English"]
},
{
"name": "Maria",
"age": 19,
"courses": ["Biology", "Java", "Art"]
}
],
"active": true
}
W obiekcie korzeniowym znajduje się pole łańcuchowe "university", pole boolowskie "active" oraz tablica "students", w której znajdują się obiekty studentów.
Schemat wizualny (diagram blokowy)
{
"klucz": wartość,
"tablica": [
{ "klucz": wartość },
{ "klucz": wartość }
],
"obiekt": {
"klucz": wartość
}
}
4. Zalety JSON
Dlaczego JSON jest tak popularny?
- Łatwy do odczytu przez człowieka i maszynę – strukturę łatwo zrozumieć.
- Kompaktowość – minimum zbędnych znaków.
- Proste parsowanie – mnóstwo bibliotek do odczytu/zapisu.
- Standard dla REST API i aplikacji mobilnych – stosowany powszechnie.
- Elastyczność – opisuje zarówno proste listy, jak i struktury drzewiaste.
- Konfiguracje, ustawienia, przechowywanie danych – często używany w konfiguracjach.
- Wsparcie we wszystkich językach – Java, Python, Go, Rust itd.
5. Praktyka: analiza przykładów plików JSON
Przykład 1: Lista użytkowników
[
{
"id": 1,
"name": "Alice"
},
{
"id": 2,
"name": "Bob"
}
]
To tablica, w której każdy element jest obiektem użytkownika.
Przykład 2: Konfiguracja aplikacji
{
"debug": true,
"maxConnections": 100,
"database": {
"host": "localhost",
"port": 5432,
"user": "admin",
"password": "qwerty"
}
}
Obiekt z zagnieżdżonym obiektem "database". Bardzo przypomina rzeczywiste ustawienia aplikacji.
Przykład 3: Błędy w JSON
{
"name": "Alice",
"age": 25,
} // Błąd: zbędny przecinek przed nawiasem zamykającym!
Zapamiętaj: w JSON nie wolno stawiać przecinka po ostatnim elemencie.
Przykład 4: Klucze bez cudzysłowów
{ name: "Alice", age: 25 } // Błąd: klucze muszą być w podwójnych cudzysłowach!
6. Przydatne szczegóły
Tabela: co wolno, a czego nie wolno w JSON
| Wolno | Nie wolno |
|---|---|
|
|
|
|
|
|
|
|
|
|
Krótkie porównanie JSON i obiektów Java
| Java | JSON |
|---|---|
|
Liczba, true/false |
|
"tekst" |
| List<T>, tablica | [wartość1, wartość2, ...] |
|
{ "klucz": wartość, ... } |
|
null |
| Klasa z polami | { "pole": wartość, ... } |
Przykład: klasa Java i jej reprezentacja w JSON
public class Student {
public String name;
public int age;
}
{
"name": "Alice",
"age": 20
}
7. Typowe błędy podczas pracy z JSON
Błąd nr 1: pojedyncze cudzysłowy zamiast podwójnych. JSON akceptuje tylko podwójne cudzysłowy dla kluczy i łańcuchów.
{ 'name': 'Alice' } // Błąd!
Błąd nr 2: zbędny przecinek. Nie wolno stawiać przecinka po ostatnim elemencie.
{ "name": "Alice", } // Błąd!
Błąd nr 3: klucze bez cudzysłowów. Klucze zawsze muszą być w podwójnych cudzysłowach.
{ name: "Alice" } // Błąd!
Błąd nr 4: liczby z wiodącymi zerami. Takie liczby są niedozwolone.
{ "age": 025 } // Błąd!
Błąd nr 5: użycie undefined. W JSON nie ma undefined, użyj null.
{ "value": undefined } // Błąd!
Błąd nr 6: True/False z wielkiej litery. W JSON tylko true i false (małymi literami).
{ "active": True } // Błąd!
GO TO FULL VERSION