Co mají společné a v čem se liší
| Oblast | XSD | JSON Schema 2020-12 |
|---|---|---|
| Model | elementy, atributy, jmenné prostory | objekty, pole, jednoduché hodnoty |
| Pořadí | sequence určuje pořadí elementů | objekt nemá významové pořadí; pole ano |
| Chybějící hodnota | minOccurs, use u atributu | required u vlastnosti |
| Prázdná hodnota | prázdný obsah není automaticky null | null je samostatná hodnota |
| Datové typy | bohatá sada včetně date a decimal | základní typy, omezení a format |
| Opakované použití | pojmenované typy, import/include | $defs, $ref |
| Vztahy mezi hodnotami | key, keyref, unique; v XSD 1.1 assertions | podmí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
<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> <zakaznik><jmeno>Jana</jmeno><vek>20</vek></zakaznik> {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"jmeno": {
"type": "string"
},
"vek": {
"type": "integer",
"minimum": 0
}
},
"required": [
"jmeno"
],
"additionalProperties": false
} {"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
<cena mena="CZK">1499.90</cena> {"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.