PDA

View Full Version : Mit JSON_TABLE Array abfragen



dschroeder
05-11-19, 14:13
Hallo,

ich möchte ein JSON Dokument parsen.

Wenn ich ein JSON habe, das aus einem Objekt besteht und ein Array beinhaltet, kann ich das problemlos parsen:

Beispiel: (Das Objekt heißt Personen und beinhaltet ein Array mit Namen und Vornamen):


set jsontest = '{ "personen" :[ {"name": "Müller", "vorname" : "Hans"}, {"name": "Meier", "vorname" : "Hugo"} ] }';


select * from JSON_TABLE(jsontest,
'lax $'
columns(
nested '$.personen
'
columns( "name" varchar(40),
"vorname" varchar(40)
)
)
) as json
;


Das obige Beispiel funktioniert sehr schön. Ich bekomme eine Tabelle mit den Namen und Vornamen.

Mein Problem ist, dass das JSON, was ich bekomme, nicht ganz so aussieht wie das obige JSON. Mein JSON fängt direkt mit den eckigen Klammern an. Ich habe also kein Objekt "Personen", auf das ich mich beim parsen beziehen kann. Ein JSON Validator im Internet bestätigt aber, dass es sich um gültiges JSON handelt.

Hier mein eigentliches JSON, das geparsed werden soll:


set jsontest = '[ {"name": "Müller", "vorname" : "Hans"}, {"name": "Meier", "vorname" : "Hugo"} ]';


Hat jemand eine Idee, wie man das obige JSON parsen kann?
Im Notfall müsste ich mir vorher einen Objektnamen künstlich dranbasteln. Das fände ich aber unschön.

Danke im Voraus!

Dieter

B.Hauser
05-11-19, 15:22
Das wird aktuell auch nicht von JSON_TABLE unterstützt. Soweit ich weiß gibt es hierfür jedoch einen RFE.
Der zu parsende String muss immer aktuell mit einem Objekt beginnen.
Also muss man ein bisschen tricksen.

Da es sich bei den JSON-Daten um einen Text-String handelt, kannst du das Array einfach in ein Objekt packen und dann den so gebildeten String auflösen.


select * from JSON_TABLE('{personen: ' concat jsontest concat '}',
'$.personen '
columns( "name" varchar(40),
"vorname" varchar(40)
)
)
) as json

Birgitta

dschroeder
05-11-19, 15:35
Vielen Dank, Birgitta!

Genau diesen Hack hatte ich mir auch überlegt. Ich hatte nur gedacht, dass es da eine elegantere Lösung gibt. Aber wenn es da bereits einen RFE gibt, muss ich mir keine Gedanken machen, ob es im Moment etwas besseres gibt.

Dieter