Převod XML ↔ JSON

XML a JSON mají jiné datové modely. Převod potřebuje dohodu o kořenu, atributech, textu, polích a typech. Na těchto příkladech vyzkoušíš oba směry a poznáš, které informace mohou zmizet.

Autor: Aktualizováno

Nejdřív vyber mapování

XML je uspořádaný strom elementů s atributy, jmennými prostory a textovými uzly. JSON obsahuje objekty, pole a skalární hodnoty. Neexistuje jediný standardní JSON zápis libovolného XML. Některé knihovny používají @id, jiné _id, a text může být v #text či _text. Oba systémy musejí znát stejnou konvenci.

Následující příklady používají výchozí nastavení rozhraní XML nástroje: prefix atributů @, textový klíč #text, pole jen pro opakované elementy, sloučený text a vypnutý převod čísel. Jde o nastavení tohoto webu, nikoli pravidlo JSON. Kořenový element je klíč vnějšího objektu.

XML → JSON krok za krokem

Vstup XML
<kniha id="k1"><nazev>XML</nazev><cena mena="CZK">12.50</cena></kniha>
Výstup při uvedeném nastavení
{
  "kniha": {
    "@id": "k1",
    "nazev": "XML",
    "cena": {
      "@mena": "CZK",
      "#text": "12.50"
    }
  }
}
  1. Vlož XML do editoru XML nástroje a ověř syntaxi.
  2. Otevři Převody, zvol JSON a ponech uvedené nastavení atributů a textu.
  3. Spusť převod a porovnej výstup s ukázkou. Cena je objekt, protože má atribut i text; název je jen řetězec.
  4. Změň prefix na _ a textový klíč na _text. V ceně vzniknou klíče _mena a _text; hodnoty zůstanou stejné.

Odesílatel a příjemce musí používat stejné názvy klíčů a stejné mapování XML na JSON. Bezprefixové atributy mohou kolidovat s názvy elementů; pro předávání neznámých dat tuto volbu nepoužívej bez kontroly.

JSON → XML: stejná dohoda opačným směrem

JSON k převodu do XML
{
  "katalog": {
    "@verze": "1",
    "kniha": [
      {
        "@id": "k1",
        "nazev": "XML & JSON"
      },
      {
        "@id": "k2",
        "nazev": "XPath"
      }
    ]
  }
}
Výsledná struktura; odsazení se může lišit
<katalog verze="1"><kniha id="k1"><nazev>XML &amp; JSON</nazev></kniha><kniha id="k2"><nazev>XPath</nazev></kniha></katalog>

V převodním panelu vlož JSON do výstupního editoru a použij opačný směr. Ponech stejné mapování. Pole kniha se změní na opakované sourozence. Znak ampersand serializátor escapuje; do JSON hodnoty nepiš předem &amp;.

Tento převod vyžaduje objekt s jedním kořenovým klíčem a názvy použitelné v XML. Obecné JSON, například pole na kořeni nebo klíč s mezerou, se bez dalšího mapování do tohoto modelu nevejde. Při integraci API raději vytvoř explicitní cílový model než automaticky přejmenovávat všechny problematické klíče.

Jak udržet stabilní pole

Jeden záznam
<katalog><kniha>XML</kniha></katalog>
Automatické pole: jeden záznam je skalární hodnota
{"katalog":{"kniha":"XML"}}
Vybrané prvky: kniha je pole i pro jeden záznam
{"katalog":{"kniha":["XML"]}}

Při dvou knihách automatické mapování vytvoří pole. Klient by tak musel větvit kód podle počtu položek. Zvol vybrané prvky a napiš kniha do seznamu názvů; režim každý prvek dělá pole i z jiných potomků. Chybějící element stále není automaticky prázdné pole. Pokud API vyžaduje [], doplň tuto hodnotu v doménovém mapování.

Čísla, identifikátory a prázdné hodnoty

Texty v XML
<zaznam><id>001</id><cena>12.50</cena><aktivni>true</aktivni><poznamka/></zaznam>
Bez převodu čísel
{"zaznam":{"id":"001","cena":"12.50","aktivni":"true","poznamka":""}}
Převod čísel zapnutý, prázdný prvek nastavený na null
{"zaznam":{"id":"001","cena":12.5,"aktivni":true,"poznamka":null}}

001 neodpovídá syntaxi čísla používané převodníkem a zůstane text. Hodnota 12.50 jako číslo ztratí informaci o dvou desetinných místech. U částek a identifikátorů určete s příjemcem, zda se předávají jako text, nebo číslo a jakou přesnost je potřeba zachovat. Automatický odhad typu nenahrazuje kontrolu podle XSD ani JSON Schema.

Vynechaný element, prázdný element a element s xsi:nil="true" mají různý význam. Volba prázdné hodnoty "", null nebo {} pouze řídí reprezentaci. Nástroj z ní neodvozuje XSD nillability. Při opačném převodu null nevytváří automaticky xsi:nil. Prázdný string a null se proto mohou vrátit jako stejně prázdný element.

Smíšený obsah a ztráta pořadí

Pořadí textu a elementu je významové
<p>Ahoj <b>Evo</b>!</p>
Sloučený text: pozice zvýraznění se ztratila
{"p":{"b":"Evo","#text":"Ahoj !"}}
Zachovat pořadí (#content)
{"p":{"#content":["Ahoj ",{"b":"Evo"},"!"]}}

Režim zachovat pořadí použij před převodem odstavců, popisů a dalších elementů obsahujících text i potomky. Opačný převod pak ví, kam vložit b. Tento režim ale není obecná archivace XML: komentáře, processing instructions, původní entity a rozlišení CDATA/textu se neuchovávají. Zpracování také ořezává některé krajní bílé znaky a vynechává čistě whitespace textové uzly. Pro přesnou kopii uchovej původní soubor.

Jmenné prostory a kontrola návratu

Stejné lokální jméno, různé významy
<r xmlns:a="urn:sklad" xmlns:b="urn:ucetnictvi"><a:kod>001</a:kod><b:kod>002</b:kod></r>

Bez odstranění namespace se v JSON zachovají prefixovaná jména a deklarace jako atributy. Prefix však není identita namespace: dva různé prefixy mohou označovat stejné URI. Po odstranění namespace skončí oba elementy pod kod a jejich rozdílný význam zmizí. Zvlášť zkontroluj atributové hodnoty typu QName, například xsi:type, jejichž interpretace vyžaduje vazbu prefixu.

  1. Ověř vstup podle požadovaného XSD nebo JSON Schema, pokud je pro daný formát k dispozici.
  2. Proveď převod se zdokumentovanými volbami.
  3. Validuj výstup podle cílového schématu.
  4. Proveď návrat a porovnej hodnoty, počet záznamů, namespace a smíšený obsah.
  5. Odliš doménovou shodu od shody původních bajtů. Pro podpis nebo důkaz původu pracuj s původním dokumentem.

Pokračuj XSD vs JSON Schema, porovnáním XML a CSV/YAML převody. Specifikace XML 1.0 a RFC 8259 definují vstupní formáty, nikoli tuto převodní konvenci.