Frage zur Extraktion von JSON Daten unterschiedl. Aufbaus
Verfasst: 22.08.2020 10:36
Moin zusammen,
ich bin offenbar nicht der JSON Typ - jedenfalls kämpfe ich gerade mit einer sehr einfachen JSON-Struktur, die ich nicht extrahiert bekomme.
Und zwar möchte ich einen JSON String der immer gleiche Kopfelemente, aber unterschiedliche "Detaileinträgen" hat, in eine immer gleich aufgebaute Struktur extrahieren.
Der String hat dabei folgenden Aufbau (hier direkt als reales Beispiel):
Datablock kann dabei entweder nichts enthalten ("datablock":[]) oder ein oder mehrere Objekte mit unterschiedlichem Aufbau. Mit "unterschiedlich" ist gemeint, dass der Aufbau innerhalb eines JSON-Strings gleich ist, es aber unterschiedliche JSON-String Typen gibt, die alle in die selbe Struktur extrahiert werden sollen. Wenn also z.B. Userdaten kommen (siehe Beispiel oben), dann sind die Values in datablock[] anders benannt als bei Produkten - siehe folgendes Beispiel:
Mein Gedanke war nun, dass ich für die Array-Aufzählung in "datablock":[{...}] eine Liste nehme, die ihrerseits wieder Maps für die JSON Objekte enthalten "datablock":[{...}] .
Leider funktioniert das nicht so wie ich mir das vorstelle. Muss ich hier mit Pointern arbeiten oder wie realisiert man das?
Gruß Markus
ich bin offenbar nicht der JSON Typ - jedenfalls kämpfe ich gerade mit einer sehr einfachen JSON-Struktur, die ich nicht extrahiert bekomme.
Und zwar möchte ich einen JSON String der immer gleiche Kopfelemente, aber unterschiedliche "Detaileinträgen" hat, in eine immer gleich aufgebaute Struktur extrahieren.
Der String hat dabei folgenden Aufbau (hier direkt als reales Beispiel):
Code: Alles auswählen
{"status":"OK",
"message":"Der Benutzer wurde angemeldet.",
"count":1,
"datablock":
[
{"users_id":"2",
"accesslevel":"1",
"firstname":"test2",
"lastname":"test2",
"alias":"TE2",
"email":"test2@test.de",
"active":"1"
}
]
}
Code: Alles auswählen
"datablock":
[
{"product_id":"1008",
"name":"Erbsensuppe",
"price":"0,89",
"stockamount":"29"
},
{"product_id":"1009",
"name":"Brathering",
"price":"2,19",
"stockamount":"31"
}
]
Leider funktioniert das nicht so wie ich mir das vorstelle. Muss ich hier mit Pointern arbeiten oder wie realisiert man das?
Code: Alles auswählen
EnableExplicit
Structure structDataBlock
Map datablockmember.s()
EndStructure
Structure structResponse
status.s
message.s
count.i
List datablock.structDataBlock()
EndStructure
Global stResponse.structResponse
Global sResult.s
;sResult = ~"{\"status\":\"OK\",\"message\":\"Der Benutzer wurde erfolgreich abgemeldet.\",\"count\":0,\"datablock\":[]}"
sResult = ~"{\"status\":\"OK\",\"message\":\"Der Benutzer wurde angemeldet.\",\"count\":1,\"datablock\":[{\"users_id\":\"2\",\"accesslevel\":\"1\",\"firstname\":\"test2\",\"lastname\":\"test2\",\"alias\":\"TE2\",\"email\":\"test2@test.de\",\"active\":\"1\"}]}"
;sResult = ~"{\"status\":\"OK\",\"message\":\"Produktinformationen\",\"count\":1,\"datablock\":[{\"product_id\":\"1008\",\"name\":\"Erbsensuppe\",\"price\":\"0,89\",\"stockamount\":\"29\"}]}"
;sResult = ~"{\"status\":\"OK\",\"message\":\"Produktinformationen\",\"count\":2,\"datablock\":[{\"product_id\":\"1008\",\"name\":\"Erbsensuppe\",\"price\":\"0,89\",\"stockamount\":\"29\"},{\"product_id\":\"1009\",\"name\":\"Brathering\",\"price\":\"2,19\",\"stockamount\":\"31\"}]}"
Debug sResult
If ParseJSON(0, sResult)
ExtractJSONStructure(JSONValue(0), @stResponse, structResponse)
FreeJSON(0)
Debug stResponse\status + ": " + stResponse\message + ", Count: " + stResponse\count
ForEach stResponse\datablock()
ForEach stResponse\datablock()\datablockmember()
Debug stResponse\datablock()\datablockmember()
Next
Next
Else
Debug "JSON Fehler"
EndIf