Modul JSON: Unterschied zwischen den Versionen
Zeile 127: | Zeile 127: | ||
<nowiki>$JSON_DATA greift auf die einzelnen Felder eines Elementes eines JSON-Arrays zu, durch das mit #json_loop geloopt wird.</nowiki> | <nowiki>$JSON_DATA greift auf die einzelnen Felder eines Elementes eines JSON-Arrays zu, durch das mit #json_loop geloopt wird.</nowiki> | ||
+ | |||
+ | '''Name auslesen''' | ||
+ | |||
+ | Bisweilen sind die Daten im Namen und nicht in den Values, siehe folgendes Beispiel: | ||
+ | |||
+ | [ | ||
+ | { | ||
+ | "FIWI23": { | ||
+ | "lower_bound":39, | ||
+ | "upper_bound":116, | ||
+ | "average_case":77 | ||
+ | } | ||
+ | }, | ||
+ | { | ||
+ | "INBA24": { | ||
+ | "lower_bound":39, | ||
+ | "upper_bound":116, | ||
+ | "average_case":77 | ||
+ | } | ||
+ | }, | ||
+ | { | ||
+ | "NOHA24": { | ||
+ | "lower_bound":46, | ||
+ | "upper_bound":138, | ||
+ | "average_case":92 | ||
+ | } | ||
+ | } | ||
+ | ] | ||
+ | |||
+ | Hier können die Daten wie folgt ausgelesen werden: | ||
+ | |||
+ | #cmd_clear | ||
+ | #cmd #val_set n=1 z=$JSON_DATA(dat,!name) | ||
+ | #cmd #message c="$VAL(1) - $JSON_DATA(dat,$VAL(1).average_case) - $JSON_DATA(dat,$VAL(1).lower_bound) - $JSON_DATA(dat,$VAL(1).upper_bound) " | ||
'''Parameter''' | '''Parameter''' | ||
# Name der XML-Loop (parameter n in #json_loop) | # Name der XML-Loop (parameter n in #json_loop) | ||
− | # Pfad; bei Felder, die direkt unter der Loop-Ebene liegen, nur der Feldname, ansonsten ein entsprechender Pfad, siehe zweites Beispiel. | + | # Pfad; bei Felder, die direkt unter der Loop-Ebene liegen, nur der Feldname, ansonsten ein entsprechender Pfad, siehe zweites Beispiel. Alternativ kann mit !name der Name ausgelesen werden. |
# optional: Trennzeichen, mit dem die Elemente im Pfad getrennt werden; default ist der Punkt | # optional: Trennzeichen, mit dem die Elemente im Pfad getrennt werden; default ist der Punkt | ||
Version vom 27. Juni 2023, 16:01 Uhr
Das Modul JSON stellt ein paar Routinen zum Umgang mit JSON bereit.
Inhaltsverzeichnis
#json_clearall
#json_clearall löscht die Liste der geparsten JSONs
Parameter
keine
Beispiel
#json_clearall
#json_parse
#json_parse parst ein JSON, das ist die Voraussetzung für den Einsatz der weiteren Routinen.
Es handelt sich dabei um eine nummerierte Prozedur. #json_parse parst in die ersten JSON-Daten, #json_parse2 in die zweiten und so weiter.
Parameter
- cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
- json - der Text, der geparst werden soll; Funktionen werden ersetzt
Beispiel
#http_request y=post cy="application/json" request=$TEXT(1) response=resp se=Y acc=application/json $CODE$ #cout c=$VAR(resp) #json_parse json=$VAR(resp) #json_loop n=dat er=c_test2_line path=rest.searchCustomerResponse
#json_loop
#json_loop durchläuft die verschiedenen Items im Array eines geparsten JSON und führt dabei jeweils die in er genannte Subroutine aus. Auf die einzelnen Daten des JSONkann mit $JSON_DATA zugegriffen werden.
Es handelt sich dabei um eine nummerierte Prozedur. #json_loop loopt durch die ersten JSON-Daten, #json_loop2 durch die zweiten und so weiter.
Parameter
- cnd - ("condition") Die Prozedur wird nur dann ausgeführt, wenn das Statement in cnd Y ergibt. Default ist Y, Funktionen werden ersetzt
- db - ("database") Name der Datenbank, in der eine Transaktion gestartet wird, wenn ert = Y ist.
- er - ("each row") Das Kommando, das für jede Zeile der Datenmenge aufgerufen wird. Funktionen werden ersetzt.
- ern - ("each row no") Das Kommando, das für jede Zeile der Datenmenge aufgerufen wird. Funktionen werden nicht ersetzt. Wenn ern einen Wert hat, bleibt er unberücksichtigt. Üblicherweise wird er verwendet.
- ert - ("each row transaction") Wenn Y, wird für jede Zeile der Datenmenge eine eigene Transaktion gestartet und nach der Abarbeitung des Kommandos wieder geschlossen.
- m - ("maximum") Es wird maximal für die Anzahl der angegebenen Zeilen das in er angegebene Kommando ausgeführt. Dieser Parameter wird häufig dazu verwendet, während der Entwicklung mit einer geringen Zahl von Datensätzen zu arbeiten.
- nex ("no exception") - Wenn Y, wird bei Exceptions in er nicht abgebrochen, sondern mit dem nächsten Datensatz fortgesetzt. Default N, Funktionen werden ersetzt.
- n - Name der Datenmenge, wird benötigt, um mit $JSON_DATA() auf die einzelnen Felder zugreifen zu können.
- path - Pfad im JSON, der zu dem Array führt, durch das geloopt werden soll; Funktionen werden ersetzt
- sep ("separator") - Das Trennzeichen, mit dem die Elemente im Parameter path getrennt sind; Funktionen werden ersetzt, default ist der Punkt
Beispiel
siehe #json_parse
#json_chg
Ändert einen Wert in einem geparsten JSON.
Es handelt sich dabei um eine nummerierte Prozedur. #json_chg ändert in den ersten JSON-Daten, #json_chg2 in den zweiten und so weiter.
Parameter
- add - wenn Y, dann wird der mit path adressierte Eintrag erforderlichenfalls angelegt; default N, Funktionen werden ersetzt
- cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
- is ("is string") - wenn Y, dann wird der übergebene Wert z auf jeden Fall als String interpretiert, auch wenn er sich in eine Zahl oder in ein Datum wandeln lassen würde; default Y, Funktionen werden ersetzt
- path - Pfad im JSON, der zu dem JSON-Feld führt
- sep ("separator") - Das Trennzeichen, mit dem die Elemente im Parameter path getrennt sind; Funktionen werden ersetzt, default ist der Punkt
- z - Wert, der in das XMLJSONFeld geschrieben wird; Funktionen werden ersetzt
Beispiel
#json_parse json=$VAR(resp) #json_chg path=rest.searchCustomerResponse.customer.firstName z=$PVAL(grid,firstName,looprow) #json_chg path=rest.searchCustomerResponse.customer.lastName z=$PVAL(grid,lastName,looprow) #json_chg path=rest.searchCustomerResponse.customer.contactData.phone z=$PVAL(grid,contactData.phone,looprow)
Das Beispiel zeigt einen Ausschnitt aus einem Save-Kommando: Zunächst werden die Daten über einen REST-Server geholt (das ist noch nicht im Beispiel-Code), geparst, dann werden einzelne Felder durch die Daten im Grid ersetzt, danach (auch wieder nicht im Beispiel-Code) werden die Daten zum REST-Server zurück geschrieben.
#json_chgdata
Ändert einen Wert im aktuellen Node einer #json_loop-Schleife
Es handelt sich dabei um eine nummerierte Prozedur. #json_chgdata ändert in den ersten JSON-Daten, #json_chgdata2 in den zweiten und so weiter.
Parameter
- add - wenn Y, dann wird der mit path adressierte Eintrag erforderlichenfalls angelegt; default N, Funktionen werden ersetzt
- cnd ("condition") - wenn Y, dann wird die Prozedur ausgeführt; default Y, Funktionen werden ersetzt
- is ("is string") - wenn Y, dann wird der übergebene Wert z auf jeden Fall als String interpretiert, auch wenn er sich in eine Zahl oder in ein Datum wandeln lassen würde; default Y, Funktionen werden ersetzt
- path - Pfad im JSON, der zu dem JSON-Feld führt
- sep ("separator") - Das Trennzeichen, mit dem die Elemente im Parameter path getrennt sind; Funktionen werden ersetzt, default ist der Punkt
- z - Wert, der in das XMLJSONFeld geschrieben wird; Funktionen werden ersetzt
Beispiel
#cmd_clear #json_chgdata n=json path=id add=Y is=N z="$STREXTR($JSON_DATA(json,product_url),ffe,/shop/products/)" #json_loop n=json er=1 path=products
Extrahiert auf einem übergebenen Pfad (/shop/products/27) die ID (27) und schreibt sie in ein zusätzlichen Wert namens id. Die ID soll als Nummer interpretiert werden, darum ist is auf N zu setzen.
$JSON_TEXT
Die Funktion $JSON_TEXT erzeugt aus einem geparsten JSONwieder einen Text.
Parameter
- Nummer des geparsten JSON
- Typ
- flat - einfach nur der Text ohne Zeilenumbruch
- frm - formatiert
- optional: Pfad des Teils des geparsten JSON, das in einen Text gewandelt werden soll; ohne diesen Parameter wird das gesamte geparste JSONin einen Text gewandelt.
- optional: Trennzeichen, mit dem die Elemente im Pfad getrennt werden; default ist der Punkt
Beispiele
#text $JSON_TEXT(1,frm,rest.searchCustomerResponse.customer)
$JSON_VALUE
$JSON_VALUE gibt einen konkreten Wert aus einem geparsten JSONzurück
Parameter
- Nummer des geparsten JSON
- Pfad zum gewünschten Wert
- optional: Trennzeichen, mit dem die Elemente im Pfad getrennt werden; default ist der Punkt
Beispiel
#cout c=$JSON_VALUE(1,rest.searchCustomerResponse.customer.firstName)
$JSON_DATA
$JSON_DATA greift auf die einzelnen Felder eines Elementes eines JSON-Arrays zu, durch das mit #json_loop geloopt wird.
Name auslesen
Bisweilen sind die Daten im Namen und nicht in den Values, siehe folgendes Beispiel:
[ { "FIWI23": { "lower_bound":39, "upper_bound":116, "average_case":77 } }, { "INBA24": { "lower_bound":39, "upper_bound":116, "average_case":77 } }, { "NOHA24": { "lower_bound":46, "upper_bound":138, "average_case":92 } } ]
Hier können die Daten wie folgt ausgelesen werden:
#cmd_clear #cmd #val_set n=1 z=$JSON_DATA(dat,!name) #cmd #message c="$VAL(1) - $JSON_DATA(dat,$VAL(1).average_case) - $JSON_DATA(dat,$VAL(1).lower_bound) - $JSON_DATA(dat,$VAL(1).upper_bound) "
Parameter
- Name der XML-Loop (parameter n in #json_loop)
- Pfad; bei Felder, die direkt unter der Loop-Ebene liegen, nur der Feldname, ansonsten ein entsprechender Pfad, siehe zweites Beispiel. Alternativ kann mit !name der Name ausgelesen werden.
- optional: Trennzeichen, mit dem die Elemente im Pfad getrennt werden; default ist der Punkt
Beispiele
#cout c="$JSON_DATA(dat,firstName) $JSON_DATA(dat,lastName)" #cout c="$JSON_DATA(dat,contactData.phone)"
$JSON
$JSON ermittelt einen Teil eines JSONs, das im Gegensatz zu den anderen Funktionen im Modul JSON nicht geparst sein muss. Statt der Nummer eines geparsten JSON wird der Name einer Variable angegeben, in der sich das JSON befindet.
Parameter
- Name der Variable, in der sich das JSON befindet
- Pfad; bei Felder, die direkt unter der Loop-Ebene liegen, nur der Feldname, ansonsten ein entsprechender Pfad, siehe zweites Beispiel.
- optional: Wenn Y, wird die Groß- und Kleinschreibung bei der Suche im JSON ignoriert.
- optional: Trennzeichen, mit dem die Elemente im Pfad getrennt werden; default ist der Punkt
Beispiel
#http_request y=post cy="application/json" request=$TEXT(1) response=resp se=Y acc=application/json $CODE$ #cout c="$JSON(resp,rest.searchCustomerResponse.customer.firstName)"