Zkratka JSON znamená JavaScript Object Notation. Jedná se o textový formát pro uložení strukturovaných dat. Je velmi jednoduchý na čtení pro člověka i stroj. V dnešní době se jedná o standard pro výměnu dat mezi systémy, hlavně skrze API (konkrétně REST API).
Podoba JSON
JSON ukládá data ve formě párů klíč–hodnota. Podobá se slovníku (dictionary) nebo objektu v C#.
{
"Name": "Alice",
"Age": 30,
"City": "Praha"
}Hodnoty na pravé straně mají vždy jeden z podporovaných datových typů:
- řetězec (string) – využívají se uvozovky
- číslo (number, celé nebo desetinné)
- boolean (true/false)
- pole (array) – reprezentováno hranatými závorkami, do kterých se umisťují hodnoty
- objekt (object) – reprezentováno složenými závorkami, do kterých se umisťují hodnoty
- null – prázdná/nevyplněná hodnota
Vnořování objektů
Objekty je možné do sebe vnořovat. Tím je tvořena stromová struktura JSON.
Ukázka
{
"StringValue": "Ahoj světe",
"NumberValue": 123.45,
"BooleanTrue": true,
"BooleanFalse": false,
"NullValue": null,
"ArrayValue": [1, 2, 3, "čtyři", false],
"ObjectValue": {
"NestedString": "Vnořený objekt",
"NestedNumber": 999
}
}Výhody a Nevýhody
- ✅ jednoduchý a přehledný formát
- ✅ univerzální (web, mobil, databáze, konfigurace)
- ✅ malý objem dat (kratší než XML)
- ✅ dobře podporovaný ve všech jazycích (C#, Java, JavaScript, Python, …)
- ❌ neobsahuje schéma (není pevně dané, jaká data tam musí být) – schéma se musí validovat externě
- ❌ neukládá typy (všechno je text nebo číslo, typy se odvozují až při čtení)
- ❌ nepodporuje komentáře
Práce s JSON v .NET
Pro práci s JSON v .NET se nejčastěji využívají knihovny: System.Text.Json a Newtonsoft.Json. Historicky byl balíček od Newtonsoft velmi populární, aktuálně se ale spíše využívá balíček od Microsoftu.
Ukázka práce v System.Text.Json
Model
public class Person
{
public required string Name { get; set; }
public required int Age { get; set; }
public required string City { get; set; }
}Serializace
var fileName = "people.json";
var people = new List<Person>
{
new Person { Name = "Alice", Age = 30, City = "Praha" },
new Person { Name = "Bob", Age = 25, City = "Brno" }
};
var options = new JsonSerializerOptions
{
WriteIndented = true // formátování pro lepší čitelnost
};
string json = JsonSerializer.Serialize(people, options);
File.WriteAllText(fileName, json);Obsah souboru people.json.
[
{
"Name": "Alice",
"Age": 30,
"City": "Praha"
},
{
"Name": "Bob",
"Age": 25,
"City": "Brno"
}
]Warning
Ukázka pro zjednodušení neřeší správné ošetření výjimek. To je pro zajištění stability aplikace při práci se soubory na disku klíčové. Více v Výjimky.
Deserializace
var fileName = "people.json";
string json = File.ReadAllText(fileName);
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true // ignorování velikostí písmen v názvech proměnných
};
List<Person>? people = JsonSerializer.Deserialize<List<Person>>(json, options);
if (people != null)
{
foreach (var person in people)
{
Console.WriteLine($"{person.Name} ({person.Age}) z města {person.City}");
}
}Warning
Ukázka pro zjednodušení neřeší správné ošetření výjimek. To je pro zajištění stability aplikace při práci se soubory na disku klíčové. Více v Výjimky.
Názvy parametrů
Pro zvýšení čitelnosti kódu může být výhodné využívat jiné názvy vlastností v programu a v JSON. Toho lze dosáhnout využitím JsonPropertyName atributů.
Ukázka
using System.Text.Json.Serialization;
public class Person
{
[JsonPropertyName("_id")]
public int Id { get; set; }
public string Name { get; set; }
}
Person p = new Person
{
Id = 17,
Name = "Pepa"
};Ukázka výstupu serializace instance p:
{
"_id": 17,
"Name": "Pepa"
}