XSD vs JSON Schema

XSD validuje XML, JSON Schema validuje JSON. Obě určují, jak mají data vypadat: například povinná pole a povolené typy hodnot. XML a JSON mají odlišnou strukturu, proto převod mezi schématy nemusí zachovat všechna pravidla.

Autor: Aktualizováno

Co mají společné a v čem se liší

OblastXSDJSON Schema 2020-12
Modelelementy, atributy, jmenné prostoryobjekty, pole, jednoduché hodnoty
Pořadísequence určuje pořadí elementůobjekt nemá významové pořadí; pole ano
Chybějící hodnotaminOccurs, use u atributurequired u vlastnosti
Prázdná hodnotaprázdný obsah není automaticky nullnull je samostatná hodnota
Datové typybohatá sada včetně date a decimalzákladní typy, omezení a format
Opakované použitípojmenované typy, import/include$defs, $ref
Vztahy mezi hodnotamikey, keyref, unique; v XSD 1.1 assertionspodmínky a kombinace; omezené vztahy mezi hodnotami

Schéma není parser ani univerzální kontrola správnosti. Nejprve ověř syntaxi, potom strukturu a typy, a nakonec aplikační pravidla. Platné IČO nebo částka v povoleném rozsahu ještě nezaručují správnou fakturu.

Stejný záměr, dvě schémata

zakaznik.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="zakaznik">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="jmeno" type="xs:string"/>
        <xs:element name="vek" type="xs:nonNegativeInteger" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
Platné XML
<zakaznik><jmeno>Jana</jmeno><vek>20</vek></zakaznik>
zakaznik.schema.json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "jmeno": {
      "type": "string"
    },
    "vek": {
      "type": "integer",
      "minimum": 0
    }
  },
  "required": [
    "jmeno"
  ],
  "additionalProperties": false
}
Platný JSON
{"jmeno":"Jana","vek":20}

V obou případech je jméno povinné a věk volitelný. XSD zde vyžaduje pořadí jméno, věk. JSON objekt takové pořadí nevyžaduje. Obě schémata dovolují prázdné jméno; přidej omezení délky, pokud je nechceš.

Chybějící, prázdné a null

XML <jmeno/> znamená element bez obsahu, nikoli obecně null. xsi:nil="true" je možné jen pro element s nillable="true". V JSON se chybějící vlastnost liší od vlastnosti s null; povolení řídí zvlášť required a type.

xs:decimal nelze obecně mapovat na JavaScript Number bez ztráty přesnosti. Pro peníze nebo velká ID navrhni přenosovou konvenci výslovně. Ani datum nemá v JSON vlastní typ.

Výběr a kompatibilita

Použij XSD, pokud příjemce vyžaduje XML a potřebuješ kontrolovat jmenné prostory, atributy nebo pořadí elementů. Pro JSON API a konfiguraci použij JSON Schema. V XSD rozlišuj 1.0 a 1.1; podpora podmínek xs:assert a dalších rozšíření závisí na validátoru. U JSON Schema uveď verzi pravidel (dialekt) a ověř, že ji validátor podporuje.

Automatický převod je návrh, který vyžaduje kontrolu: smíšený obsah, jmenné prostory, identitní omezení i přesné typy se mohou ztratit. Základy obou technologií najdeš v kurzu XSD a kurzu JSON Schema.

Proč stejné údaje nemusí mít stejné schéma

XML: hodnota s atributem
<cena mena="CZK">1499.90</cena>
Jedna z možných JSON reprezentací
{"castka":"1499.90","mena":"CZK"}

V XML je měna atribut a částka text elementu. V JSON jsme zvolili objekt se dvěma vlastnostmi. Jiný převodník by mohl použít klíče @mena a #text. Dokud nezvolíš mapování, neexistuje ani jedno správné odpovídající JSON Schema.

XSD může částku kontrolovat jako xs:decimal. V tomto JSON zápisu je částka text, takže type: number by ji odmítlo; pravidla musí odpovídat skutečně posílaným datům. Pravidla xs:decimal popisuje XSD Datatypes. Při převodu zvlášť zkontroluj povinné hodnoty, seznamy a rozdíl mezi chybějící hodnotou, prázdným textem a null.