JSON fomátování

Pro příklad si ukážeme možnost implementace vstupu a výsutpu s obecně uvedenými objekty. Struktura je volena tak, aby bylo možné ukázat způsoby formátování kmenových dat.


JSON vstupní data

JSON data na vstupu:

[
{
"name":"Novák",
"email":"novak@email.cz"
}
]

Jsou převedena na následující XML obálku:

<http:root xmlns:http="http://www.flexideo.com/actions/http">
<jsn:root xmlns:jsn="http://www.flexideo.com/actions/json" type="array">
<jsn:element type="object">
<name type="string">Novák<name>
<email type="string">novak@email.cz<email>
</jsn:element>
</jsn:root>
</http:root>

Obálka http:root je krom SOAP akcí na vstupu vždy. Důvodem je pouze to, že takto do jednoho XML uzlu je možné převádět potenciálně více uzlů objektů na vstupu, aniž by to vedlo k neplatnému XML (platné XML má pouze jeden kmenový uzel).

Hranatá závorka v kmenu vstupních dat, která indikuje pole hodnot, nikoli jen single hodnotu, je identifikována datovým typem v uzlu jsn:root. Právě tento XML uzel, který je přímým potomkem kmenového http:root je identifikátorem datového typu obdrženého na vstupu. Akce mohou být definovány tak, aby přijímaly data ve více formátech a strukturách a pokud je rozlišení dáno jen formátem obdržných dat, pak je právě tento root uzel identifikátorem použitého (obdrženého) formátu.

Pokud by na vstupu nebyl přijímán seznam hodnot (pole), pak by vstupní JSON byl bez úvodní hranaté závorky:

{
"name":"Novák",
"email":"novak@email.cz"
}

A byl by přeložen na následující XML obálku:

<http:root xmlns:http="http://www.flexideo.com/actions/http">
<jsn:root xmlns:jsn="http://www.flexideo.com/actions/json" type="object">
<name type="string">Novák<name>
<email type="string">novak@email.cz<email>
</jsn:root>
</http:root>

Tj. samotný jsn:root je nositelem jednoho obdrženého objektu (type="object").


JSON data na výstupu

Předpokládejme, že získaná data by byla i na výstupu, pak by finální transformace připravila na výstup pro zpracování a odeslání serverem následující XML podklad:

<http:root xmlns:http="http://www.flexideo.com/actions/http">
<jsn:root xmlns:jsn="http://www.flexideo.com/actions/json" type="array">
<jsn:element type="object">
<name type="string">Novák<name>
<email type="string">novak@email.cz<email>
<address type="string">Horní 15, Zadní Lhota<address>
<id type="number">123456<id>
</jsn:element>
<jsn:element type="object">
<name type="string">Novák<name>
<email type="string">novak@email.cz<email>
<address type="string">Dolní 10, Přední Lhota<address>
<id type="number">123789<id>
</jsn:element>
</jsn:root>
</http:root>

HTTP wrapper (kmenový uzel ve jm. prostoru, pokud je uveden) je vždy před odesláním odebrán. Jeho úkolem je opět ošetřit potenciálně možné odesílání více dat, byť ne příliš obvyklé.

Kmenový uzel JSON pak říká, že na výstupu má být pole. Podřízený element pak definuje datový typ prvků tohoto pole jako pole objektů. Konečným výstupem odesílaným v podpovědi serverem tak bude:

[
{
"name":"Novák",
"email":"novak@email.cz"
"address":"Horní 15, Zadní Lhota"
"id":123456
},
{
"name":"Novák",
"email":"novak@email.cz"
"address":"Dolní 10, Přední Lhota"
"id":123789
}
]

Jde tedy o nalezení dvou Nováků používajících stejný email, každý ale bydlí jinde.

K datovým typům při převodu na JSON:

V odpovědi je rovněž id, které bylo v podkladovém XML definováno datovým typem number, což vede k vynechání uvozovek. Pokud by v XML uzlu id nebylo uvedeno žádné platné číslo, bylo by id doplněno nulou.

Pokud by to bylo nežádoucí chování, pak je lépe datový typ v podkladovém typu neuvádět, parser při tvorbě výstupu identifikuje (rozpozná) vhodný datový typ, což by v případě uvedeného id bylo právě number.

V případě prázdného id (uvedený uzel id bez hodnoty), pak by do výstupního id v JSON odpovědi bylo za dvojtečku vložno null a k převodu na nulu by nedošlo, protože není datový ty number vyžadován.

Podobné chování má i datový typ boolean - při neuvedení je zajištěn převod na kl. slovo false bez uvozovek - tedy JSON hodnota nepravda.

Pokud bychom i v případě čísla z nějakého důvodu měli zájem o zabalení do uvozovek, pak bychom v podkladovém XML uvedli explicitně vyžadovaný typ string. Při neuvedení hodnoty v uzlu explicitně definovaného jako string, bude na výstupu prázdný string ("").


Koncept práce s formátyPříklad službyKmenový uzel datJSON fomátováníXML fomátování