Zum Hauptinhalt springen

Beispiel - JSON-Datei

Beispiel - Erstellen und Lesen einer JSON-Datei Anweisungen zum Erzeugen und Lesen einer JSON-Datei

In diesem Beispiel wird eine Funktion zum Erstellen und zum Lesen einer JSON-Datei vorgestellt und Hinweise zur Auswertung der Datei gegeben.

Folgende Funktion erzeugt eine JSON-Datei:

sub CreateJson
(
aFileName : alpha(4096);
)

local
{
tDoc : handle;
tParent : handle;
}

{
tDoc # CteOpen(_CteNode, _CteChildTree | _CteChildList);
tDoc->spID # _JsonNodeObject;

tDoc->CteInsertNode('Kreditkarte', _JsonNodeString, 'Xema');
tDoc->CteInsertNode('Nummer', _JsonNodeString, '1234-5678-9012-3456');
tParent # tDoc->CteInsertNode('Inhaber', _JsonNodeObject, '');

tParent->CteInsertNode('Name', _JsonNodeString, 'Reich');
tParent->CteInsertNode('Vorname', _JsonNodeString, 'Rainer');
tParent->CteInsertNode('Geschlecht', _JsonNodeString, 'männlich');
tParent->CteInsertNode('Alter', _JsonNodeNull, NULL);

tDoc->CteInsertNode('Deckung', _JsonNodeNumber, 1000000);
tDoc->CteInsertNode('Währung', _JsonNodeString, 'EURO');

tDoc->JsonSave(aFileName);
tDoc->CteClose();

return;
}

Die Funktion erzeugt die übergebene Datei mit festen Werten. Die Datei hat dann folgenden Inhalt:

{
"Kreditkarte":"Xema",
"Nummer":"1234-5678-9012-3456",
"Inhaber":{
"Name":"Reich",
"Vorname":"Rainer",
"Geschlecht":"männlich",
"Alter":null
},
"Deckung":1000000,
"Währung":"EURO"
}

Mit der Anweisung JsonLoad () wird die Datei in einen Baum eingelesen, der anschließend ausgewertet werden kann. Zuvor muss der Wurzelknoten erzeugt werden. Da zur Auswertung sowohl eine unsortierte, als auch eine sortierte Liste verwendet werden soll, werden beide beim Erzeugen angegeben.

sub ReadJson
(
aFileName : alpha(4096);
)

local
{
tDoc : handle;
tErr : int;
}

{
tDoc # CteOpen(_CteNode, _CteChildTree | _CteChildList);
tErr # tDoc->JsonLoad(aFileName);

Display(tDoc);

tDoc->CteClose();
}

Die Auswertung wird durch die Funktion Display vorgenommen. In diesem Beispiel wird in der Funktion ein Dialog geladen, in dem der Inhalt der Datei in einem TreeView -Objekt angezeigt wird. Der Funktion wird der Wurzelknoten des JSON-Dokuments übergeben. Das Füllen des TreeView-Objekts wird durch die Funktion DisplayChildNode() durchgeführt. Die Funktion wird rekursiv aufgerufen.

sub Display
(
aJsonRootNode : handle;
)

local
{
tHdlFrame : handle;
tNode : handle;
}

{
tHdlFrame # WinOpen('JsonDisplay', _WinOpenDialog);

tNode # $tvJson->WinTreeNodeAdd('tvRoot', 'Root');
DisplayChildNode(aJsonRootNode, tNode);

tHdlFrame->WinDialogRun(_WinDialogCenterScreen);
tHdlFrame->WinClose();
}

Das hier geladene Fenster-Objekt besteht lediglich aus einem TreeView mit dem Namen tvJson.

sub DisplayChildNode
(
aJsonNode : handle;
aTvParent : handle;
)

local
{
tJsonNode : handle;
tTvNode : handle;
}

{
// Read all child nodes
for tJsonNode # aJsonNode->CteRead(_CteFirst | _CteChildList);
loop tJsonNode # aJsonNode->CteRead(_CteNext | _CteChildList, tJsonNode);
while (tJsonNode != 0)
{
// Create a node in the treeview
tTvNode # aTvParent->WinTreeNodeAdd('tv' + tJsonNode->spName, tJsonNode->spName);
// display the content of the node depending of the type
switch (tJsonNode->spID)
{
case _JsonNodeArray :
{
}
case _JsonNodeBoolean :
{
tTvNode->wpNodeStyle # _WinNodeDoc;
if (tJsonNode->spValueLogic)
tTvNode->wpCaption # tTvNode->wpCaption + ' = true';
else
tTvNode->wpCaption # tTvNode->wpCaption + ' = false';
}
case _JsonNodeNull :
{
tTvNode->wpNodeStyle # _WinNodeDoc;
tTvNode->wpCaption # tTvNode->wpCaption + ' = n/a';
}
case _JsonNodeNumber :
{
tTvNode->wpNodeStyle # _WinNodeDoc;
// convert the value depending on the type of the numeric value
switch (tJsonNode->spType)
{
case _TypeInt : tTvNode->wpCaption # tTvNode->wpCaption + ' = ' + CnvAI(tJsonNode->spValueInt);
case _TypeFloat : tTvNode->wpCaption # tTvNode->wpCaption + ' = ' + CnvAF(tJsonNode->spValueFloat);
case _TypeBigInt : tTvNode->wpCaption # tTvNode->wpCaption + ' = ' + CnvAB(tJsonNode->spValueBigInt);
case _TypeDecimal : tTvNode->wpCaption # tTvNode->wpCaption + ' = ' + CnvAM(tJsonNode->spValueDecimal);
}
}
case _JsonNodeObject :
{
}
case _JsonNodeString :
{
tTvNode->wpNodeStyle # _WinNodeDoc;
tTvNode->wpCaption # tTvNode->wpCaption + ' = ' + tJsonNode->spValueAlpha;
}
}

DisplayChildNode(tJsonNode, tTvNode);
}
}