1. Wprowadzenie
Jeśli choć raz otwierałeś nowoczesne API, pracowałeś z web-serwisami, aplikacjami mobilnymi albo nawet po prostu próbowałeś zapisać coś w "uniwersalnym formacie" — już spotkałeś się lub spotkasz z JSON. To format, który dosłownie "łączy" różne języki programowania i nawet różne platformy: C#, JavaScript, Python — wszyscy mówią za pomocą JSON.
Dlaczego właśnie JSON stał się gwiazdą serializacji? Odpowiedź jest prosta: to kompaktowy, czytelny dla człowieka i lekki tekstowy format wymiany danych strukturalnych. Jego popularność to wynik udanego połączenia prostoty, uniwersalności i świetnego wsparcia w językach programowania.
Czym jest JSON?
JSON — to skrót od JavaScript Object Notation. Format wywodzi się ze świata JavaScript, ale bardzo szybko wyskoczył z przeglądarek do szerszego świata. Ważne: pomimo pochodzenia nazwy, JSON nie jest związany z JavaScript i jest równie wygodny dla wszystkich języków programowania.
Format został wymyślony na początku lat 2000 przez Douglasa Crockforda jako prostsza alternatywa dla rozwlekłego XML. Idea jest prosta: „JSON jest krótszy, prostszy i łatwiejszy do czytania”.
2. Podstawowe zasady formatu JSON
Najważniejsze: JSON — to ściśle określony tekstowy format dla danych strukturalnych. Żadnej magii, tylko zwykły tekst, który można otworzyć w dowolnym edytorze.
Podstawowe konstrukcje:
- Tablice (arrays): uporządkowane listy wartości.
- Obiekty (objects): zestawy par klucz-wartość.
- Proste typy: stringi, liczby, wartości boolowskie (true, false) oraz specjalna wartość null.
Przykład minimalnego dokumentu JSON:
{
"name": "Iwan",
"age": 25,
"isStudent": true,
"scores": [5, 4, 5, 3],
"contacts": {
"email": "ivan@example.com",
"phone": null
}
}
Schematyczna struktura
Oto prosta tabela odpowiadań typów C# i reprezentacji w JSON:
| Typ C# | Przykład JSON |
|---|---|
|
|
|
|
|
|
| tablica (int[], ...) | |
| obiekt (class, ...) | |
|
|
Zasady zapisu JSON
- Stringi zawsze w podwójnych cudzysłowach: 'text' — błąd, poprawnie "text".
- Klucze obiektów — stringi w podwójnych cudzysłowach: np. "name": ...
- Przecinki tylko między elementami, bez przecinka po ostatnim elemencie.
- Wcięcia nie są obowiązkowe, ale poprawiają czytelność.
- Liczby bez cudzysłowów: "age": 25, a nie "age": "25".
- Wartości boolowskie — true/false (bez cudzysłowów), nie True, FALSE ani "true".
- null zapisujemy jako null (bez cudzysłowów).
3. JSON oczami programisty
Analogie do typów C#:
- JSON-obiekt ≈ Dictionary<string, object>
- JSON-tablica ≈ T[] lub List<T>
- JSON-string ≈ zwykły string
- JSON-liczba ≈ int lub double (w zależności od wartości)
Przykład serializacji obiektu do JSON
Klasa:
public class Student
{
public string Name { get; set; } = "";
public int Age { get; set; }
public bool IsStudent { get; set; }
public int[] Scores { get; set; } = Array.Empty<int>();
}
Otrzymany JSON (upraszczamy, szczegóły serializacji później):
{
"Name": "Iwan",
"Age": 25,
"IsStudent": true,
"Scores": [5, 4, 5, 3]
}
4. Przykłady dopuszczalnych struktur JSON
Obiekt z tablicą i zagnieżdżonymi obiektami
{
"product": "Kawa",
"price": 125.50,
"inStock": true,
"attributes": {
"weight": 500,
"unit": "g"
},
"tags": ["napój", "energia", "arabika"],
"promotions": null
}
Tablica obiektów
[
{"id": 1, "name": "Petja"},
{"id": 2, "name": "Masza"},
{"id": 3, "name": "Wasja"}
]
5. Przykłady niedopuszczalnego JSON (i dlaczego)
Pojedyncze cudzysłowy:
{ 'name': 'Iwan' } // Błąd!
JSON wymaga podwójnych cudzysłowów.
Przecinek po ostatnim elemencie:
{ "x": 1, "y": 2, } // Błąd!
Nadmiarowy przecinek na końcu nie jest dozwolony.
Komentarze:
{
// Taka ładność niestety nie działa w JSON
"name": "Iwan"
}
W JSON nie ma komentarzy.
6. Po co JSON w realnych projektach?
Przekazywanie danych między systemami
JSON — uniwersalny "wspólny język" między różnymi aplikacjami, najczęściej warstwowo przez HTTP. Na przykład serwer w C# komunikuje się z frontendem w JavaScript — ich wspólny format to JSON.
Przechowywanie ustawień i danych
Wiele aplikacji trzyma ustawienia w plikach .json. Na przykład appsettings.json — standard dla aplikacji .NET. Plusy: łatwo przeczytać, zmienić i wersjonować.
API serwerowe i mobilne
Większość REST API używa JSON jako formatu zapytań i odpowiedzi: np. lista użytkowników przychodzi jako tablica obiektów.
Konfiguracja narzędzi i bibliotek
Wiele narzędzi w .NET (Serilog, Swagger i inne) używa JSON do konfiguracji. XML pojawia się coraz rzadziej — JSON jest bardziej zwarty i przejrzysty.
7. Popularność JSON: dlaczego wszyscy go lubią?
- Czytelność. Nawet osoba bez doświadczenia programistycznego zorientuje się, co jest czym.
- Wygoda przesyłu przez sieć. Zwykły tekst, mały "ciężar".
- Wsparcie we wszystkich językach. Serializacja/deserializacja dostępna "out of the box".
- Wygodny do konfiguracji. Wszelkie edytory dobrze z nim współpracują.
- Łatwość generowania. Stworzenie JSON jest bardzo proste.
- Tablice, zagnieżdżenia, null. Wszystko intuicyjne, bez "skoków nawiasowych" jak w XML.
Kiedy lepiej wybrać JSON?
- Tworzysz aplikację mobilną lub webową;
- Pracujesz z API zewnętrznych serwisów;
- Chcesz, żeby aplikacja była przyjazna dla przyszłych integracji.
8. Jak C# pracuje z JSON
Krótk o popularnych bibliotekach .NET:
- System.Text.Json — standardowa, szybka i prosta.
- Newtonsoft.Json (Json.NET) — "weteran" z ogromnym zestawem możliwości.
Minimalny przykład serializacji/deserializacji:
using System.Text.Json;
// Zamieniamy obiekt na string JSON
var student = new Student { Name = "Iwan", Age = 25, IsStudent = true, Scores = new[] {5, 4, 5, 3} };
string json = JsonSerializer.Serialize(student);
// I odwrotnie: czytamy obiekt ze stringa JSON
Student? parsed = JsonSerializer.Deserialize<Student>(json);
Console.WriteLine(json);
9. Typowe błędy początkujących przy pracy z JSON
Częsty błąd — pomylić cudzysłowy albo zapomnieć przecinek. Czasem próbują dodać komentarze (jak w C# — bo to wygodne!), ale JSON tego nie wybacza.
Kolejna częsta sytuacja — serializacja obiektów z niezainicjalizowanymi kolekcjami: w rezultacie dostajemy "scores": null zamiast oczekiwanej tablicy. Inicjalizuj kolekcje wcześniej.
Pamiętaj, że JSON to tekst: duże objętości danych zajmują dużo pamięci. Jeśli zserializujesz powiedzmy 500 MB do JSON, aplikacja może wyraźnie odczuć spadek wydajności.
GO TO FULL VERSION