Jak validovat JSON: syntaxe a JSON Schema

Validace JSON postupně ověřuje text, strukturu dat a pravidla aplikace. Na jednom záznamu projdeš syntaktickou chybu, nesprávný typ a opravený výsledek. Každá vrstva potřebuje vlastní kontrolu.

Autor: Aktualizováno

1. Zkontroluj skutečný text

Chybně — koncová čárka
{"id":1,"nazev":"XML",}
Správně — syntakticky platný JSON
{"id":1,"nazev":"XML"}

Vlož text do JSON validátoru. Koncová čárka před zavírací závorkou je chyba syntaxe; nejdřív ji oprav, protože bez načtené hodnoty nelze ověřovat datové schéma. Umístění a formulace parserové chyby se mezi knihovnami liší. Hledej také předchozí řádek: chyba může být nahlášena až v místě, kde parser pokračování nedokázal vyhodnotit.

U HTTP nejdřív zkontroluj status, typ a délku těla. HTML chybová stránka není vadný JSON. Odpověď 204 nemá obsah k parsování. Při práci se souborem používej očekávané UTF-8 a celé tělo, nikoli useknutou ukázku z logu.

2. Stanov pravidla schématem

Schéma knihy pro záložku Schéma
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "required": [
    "id",
    "nazev"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "minimum": 1
    },
    "nazev": {
      "type": "string",
      "minLength": 1
    }
  },
  "additionalProperties": false
}

Do datového editoru vlož opravenou knihu, do editoru schématu tento dokument a spusť validaci. Kořen musí být objekt, id a nazev jsou povinné, id musí být celé číslo alespoň 1 a název neprázdný text. additionalProperties: false zakazuje další pole. $schema označuje dialekt, který musí validátor skutečně podporovat.

3. Vyzkoušej negativní příklady

Pět samostatných testovacích záznamů; vkládej postupně jednotlivé objekty
[{"nazev":"XML"},{"id":"1","nazev":"XML"},{"id":0,"nazev":"XML"},{"id":1,"nazev":""},{"id":1,"nazev":"XML","admin":true}]
  • Prvnímu objektu chybí id: porušení required se vztahuje k objektu.
  • Druhý má v /id string místo integer.
  • Třetí má v /id hodnotu pod minimum.
  • Čtvrtý porušuje minLength v /nazev.
  • Pátý obsahuje nepovolené pole admin.

Cesta /id je JSON Pointer, nikoli dotaz JSONPath. Přesný text hlášení závisí na validátoru, ale příčina a dotčená hodnota mají být stejné. Vložením celého pole výše bys testoval jiný kořenový typ a dostal chybu objektu místo uvedených kontrol.

4. Oprav příčinu, nikoli jen hlášení

Záznam oprav podle pravidel schématu na {"id":1,"nazev":"XML"} a validaci zopakuj. Nepřeváděj všechny řetězce na čísla: kód 001 může být identifikátor, u nějž jsou nuly významové. Nevkládej automaticky nulu do chybějícího pole jen proto, aby zmizela chyba required.

Generátor schématu z jednoho vzorku pomůže s výchozím návrhem, ale nezná skutečně povinná pole, všechny varianty ani meze. Po vygenerování je uprav a připrav sadu platných i chybných vstupů. Generátor ukázkových dat ze schématu poskytuje příklad dat, ale nepotvrzuje, že schéma obsahuje všechna pravidla potřebná pro aplikaci.

5. Odděl schéma od obchodních pravidel

Platné id nemusí existovat v databázi a uživatel nemusí mít právo záznam číst. To kontroluje aplikace. U format ověř nastavení validátoru; samotný řetězec date-time či email nemusí ve všech režimech znamenat povinnou kontrolu. Externí reference náš nástroj nestahuje, proto připrav samostatné nebo lokálně propojené schéma.

Na serveru validuj znovu i po úspěchu v prohlížeči. Omez velikost, hloubku a dobu zpracování; používej stejné schéma v testech vstupů a odpovědí API. Podrobnosti jsou v klíčových slovech, dialektech a bezpečnosti JSON. Pravidla vycházejí z JSON Schema Validation 2020-12.