PDA

View Full Version : Objekt auslesen mit JSON_VALUE



dschroeder
23-11-22, 10:16
Hallo zusammen,
ich möchte mit der SQL-Funktion json_value einen JSON-String auslesen. Einfache Werte, z.B. einen Namen, kann ich problemlos auslesen. Ich möchte aber gerne ein ganzes Unterobjekt aus dem JSON-String auslesen und (z.B.als Clob oder langer varchar-String) weiterverarbeiten.

Hier ein Beispiel, das mein Problem beschreibt. Mein JSON hat auf der obersten Ebene 2 Elemente (id, und address). Das Element address ist ein Objekt, das wiederum weitere Werte beinhaltet. An den folgenden SQL-Snippets sieht man, dass ich an die einzelnen Element herankomme. Aber an das Gesamtobjekt komme ich nicht:



-- Folgendes klappt (Der Result ist 2):
values json_value(
'{ "id": 2,
"address": {
"name": "Meier",
"addressType": "privat",
"street": "Goethestraße 4"
}
}',
'$.id' returning varchar(1000));




-- Folgendes klappt auch (Der Result ist Meier):
values json_value(
'{ "id": 2,
"address": {
"name": "Meier",
"addressType": "privat",
"street": "Goethestraße 4"
}
}',
'$.address.name' returning varchar(1000));




-- Folgendes klappt nicht (Der Result ist null):
values json_value(
'{ "id": 2,
"address": {
"name": "Meier",
"addressType": "privat",
"street": "Goethestraße 4"
}
}',
'$.address.*' returning varchar(1000));




Ist die json_value Funktion vielleicht nur in der Lage, "Einzelwerte" zu liefern?

LG, Dieter

Fuerchau
23-11-22, 11:27
Du musst die Hierarchie des Namens beachten:

id.adress.name

Somit kannst du eben alle einzelnen Felder in Spalten umsetzen.
Jede {} kannst du quasi als Sub-DS ansehen, die mit likeds() definiert wurde.

dschroeder
23-11-22, 11:41
Hallo Baldur,
danke für deine Nachricht.
ich habe mein Problem wahrscheinlich nicht klar genug ausgedrückt:
An die einzelnen Felder komme ich problemlos dran, auch an die Subfelder von address. Siehe das 2. Beispiel: $.address.name'
Dabei kommt der korrekte Name raus (Meier).

Ich möchte im Falle von address aber nicht die einzelnen konkreten Felder zurückbekommen (dafür müsste ich dann ja pro Feld json_value aufrufen), sondern ich möchte die Gesamtheit aller Subfelder von address haben. Und zwar als ein clob, dass das JSON-Subobjekt von address enthält.

Mein Ziel ist es, das Subobjekt "address" an ein anderes RPG-Programm weiterzugeben und dort verarbeiten zu lassen. Es geht mir um Modularisierung.

Möglicherweise geht das mit der json_value Funktion nicht, aber die Doku von IBM schreibt im Bereich sql-json-path-expression, dass json-path-key-name entweder ein . oder ein * sein könnte.

Siehe https://www.ibm.com/docs/en/i/7.3?topic=predicate-sql-json-path-expression

Ahoy
23-11-22, 12:02
versuchs mal mit json_query
https://www.ibm.com/docs/en/i/7.3?topic=functions-json-query

values json_query(
'{ "id": 2,
"address": {
"name": "Meier",
"addressType": "privat",
"street": "Goethestraße 4"
}
}', '$.address');

dschroeder
23-11-22, 12:16
Hallo Ahoy!
Das ist ganz genau das, was ich gesucht habe. Super!
Man lernt nie aus.
Danke an alle für eure Mühe!

LG, Dieter