2012-10-02 4 views
5

Ich habe folgende JSON von meinem Server:Delphi/SuperObject - Zugriff auf Unterknoten

{ 
    "userid":"12", 
    "username":"TestChar", 
    "logged":"yes", 
    "status":"Premium User", 
    "areas":{ 
     "SERVICEAREA_XX1":{ 
     "id":"1", 
     "area":"SERVICEAREA_XX1", 
     "version":"3000", 
     "usr_group":"0" 
     }, 
     "SERVICEAREA_XX2":{ 
     "id":"2", 
     "area":"SERVICEAREA_XX2", 
     "version":"31000", 
     "usr_group":"0" 
     }, 
     "SERVICEAREA_XX3":{ 
     "id":"3", 
     "area":"SERVICEAREA_XX3", 
     "version":"2000", 
     "usr_group":"1" 
     } 
    } 
} 

Mit SuperObjects i die Anzahl der "Servicebereich" bekommen kann 's mit

ob['areas'].AsObject.count 

Wie kann ich jetzt Zugang zu den Elementen der verschiedenen "SERVICEAREAs" bekommen?

Danke für Ihre Hilfe ...

Antwort

7

Marjan hat die Antwort für Sie. Hier ist ein wenig mehr Informationen, wie Sie die Elementeigenschaften für den Zugriff auf mit einem Beispiel:

var 
    item: ISuperObject; 
... 
for item in ob['areas'] do 
begin 
    WriteLn(item['id'].AsInteger); 
    WriteLn(item['area'].AsString); 
    WriteLn(item['version'].AsInteger); 
end; 
+0

Danke ... das ist endlich was ich gesucht habe ... –

10

Sie Elemente eines Arrays mit einer for ... in Schleife zugreifen:

var 
    item: ISuperObject; 
begin 
    for item in ob['areas'] do ... 

oder ohne enumerator, einen 'normalen' for-Schleife:

var 
    idx: Integer; 
    item: ISuperObject; 
begin 
    for idx := 0 to ob['areas'].AsArray.Length - 1 do 
    item := ob['areas'].AsArray[idx]; 
+0

aber dann Artikel enthält: { "SERVICEAREA_XX1": { "id": "1", "Bereich": "SERVICEAREA_XX1", "Version": "3000", "usr_group": "0" } und sry aber, wie man acces da Bereich oder Version dann? –

0

Verwendung dieser Code Wenn Sie Schlüssel/Wert zugreifen möchten (wie Javascript for..in)

if ObjectFindFirst(JsonData, ite) then 
    with JsonData.AsObject do 
    repeat 
     PutO(ite.key, ite.val.Clone); 
    until not ObjectFindNext(ite); 
    ObjectFindClose(ite);