JSON fomátování

Upravit obsah stránky

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 navstupu:

            [

{

"name":"Novák",

"email":"novak@email.cz"

}

]

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

            

Novák

novak@email.cz

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 tovedlo 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ýmpotomkem 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:

            

Novák

novak@email.cz

Tj. samotný jsn:root jenositelem 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:

            

Novák

novak@email.cz

Horní 15, Zadní Lhota

123456

Novák

novak@email.cz

Dolní 10, Přední Lhota

123789

HTTP wrapper (kmenový uzel ve jm. prostoru, pokud je uveden) je vždy před odeslánímodebrá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 vpodpově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 XMLdefinová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 jelé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ý uzelid 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, pakbychom 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 ("").