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"
}