2012-03-07 17 views
6

Ho un oggetto JSON, Diamo il nome jobject che assomiglia a questo:Delphi: Accesso JSON oggetti all'interno di un array JSON

{ 
    "id": 0, 
    "data": "[{DAT_INCL: \"08/03/2012 10:07:08\", NUM_ORDE: 1, NUM_ATND: 1, NUM_ACAO: 2, NUM_RESU: 3}, 
      {DAT_INCL: \"08/03/2012 10:07:09\", NUM_ORDE: 2, NUM_ATND: 1, NUM_ACAO: 4, NUM_RESU: 5}, 
      {DAT_INCL: \"08/03/2012 10:07:09\", NUM_ORDE: 3, NUM_ATND: 1, NUM_ACAO: 8, NUM_RESU: NULL}]" 
} 

Come si può vedere, contiene due coppie, una delle quali è una matrice con tre oggetti in questo caso (la quantità di oggetti è dinamica) con più "chiavi: valori" (questi non variano, essendo sempre gli stessi 5 campi), che voglio inserire in un database SQL, essendo "chiave" colonna, "valore" essendo campo. La domanda è, come posso accedere a ciascun oggetto individualmente?

Codice-saggio ciò che ho fatto è stato estrarre la coppia che conteneva questo array mettendolo in jPair

jPair := OriginalObject.Get(1); 

e poi catturato l'array

jArray:= TJSONArray(jPair.JsonValue); 

(Inoltre, come bonus, quando Valutare jArray.Size, il risultato è 6226004. Che cosa?)

+0

Avete qualche codice? –

+0

Sto usando XE2 con DBXJSON e DBXJSONReflect. – bpromas

+0

Originariamente avevo un JSONObject diverso, quindi sostanzialmente in termini di codice quello che ho fatto è stato estrarre la coppia che conteneva questo array mettendolo in jPair (dtPair: = OriginalObject.Get (1);) e quindi catturato l'array (jArray: = TJSONArray (jPair.JsonValue);) (Devo inserire questo codice nel post originale?) – bpromas

risposta

8

Se si dispone di un array da DBXJSON, quindi è un TJSONArray. Chiama il suo metodo Get per ottenere un elemento dell'array.

var 
    Value: TJSONValue; 

Value := jArray.Get(0); 

Si può anche passare attraverso l'intero array con un for ciclo:

for Value in jArray do 

Ma se si controlla la proprietà Size e ottenere 6.226.004 invece di 3, che suggerisce che c'è qualcosa che non va Qui. La mia ipotesi è che quello che pensi sia un TJSONArray non è proprio quel tipo. Utilizzare as di fare un cast di tipo controllato:

jArray := jPair.JsonValue as TJSONArray; 

Otterrete un'eccezione EInvalidCast se fallisce.

+0

Infatti, ho ricevuto un'eccezione EInvalidCast. Ciò significa che l'array che ho nel mio JsonObject non è in realtà un array? Lavorare con JSON sta diventando sempre più una battaglia in salita. – bpromas

+1

Significa che non è un array TJSON. Il debugger dovrebbe essere in grado di dirti cosa è veramente. Se il debugger non ti dice in un suggerimento, mostra il risultato della chiamata 'jPair.JsonValue.ClassName'. –

+0

Sì, è un TJSONString e uno mal formattato. Come diavolo sto per analizzare attraverso questo? – bpromas

5

qui è un codice di esempio per analizzare e generare i dati JSON. Ho modificato i dati JSON e aggiunto il campo ArrayData, che contiene la matrice iniziale di oggetti:

program Project1; 
{$APPTYPE CONSOLE} 
{$R *.res} 

uses 
    System.SysUtils, dbxjson; 

const JSON_DATA = '{"ArrayData":['+ 
        '{"DAT_INCL":"07/03/2012 17:33:03", "NUM_ORDE":1,"NUM_ATND":1, "NUM_ACAO":2, "NUM_RESU":3},'+ 
        '{"DAT_INCL":"07/03/2012 17:33:05", "NUM_ORDE":2,"NUM_ATND":1, "NUM_ACAO":4, "NUM_RESU":5},'+ 
        '{"DAT_INCL":"07/03/2012 17:33:05", "NUM_ORDE":3,"NUM_ATND":1, "NUM_ACAO":8, "NUM_RESU":null}'+ 
        ']}'; 


var jsv : TJsonValue; 
    originalObject : TJsonObject; 

    jsPair : TJsonPair; 
    jsArr : TJsonArray; 
    jso : TJsonObject; 
    i : integer; 
begin 
    try 
     //parse json string 
     jsv := TJSONObject.ParseJSONValue(JSON_DATA); 
     try 
      //value as object 
      originalObject := jsv as TJsonObject; 

      //get pair, wich contains Array of objects 
      jspair := originalObject.Get('ArrayData'); 
      //pair value as array 
      jsArr := jsPair.jsonValue as TJsonArray; 

      writeln('array size: ', jsArr.Size); 
      //enumerate objects in array 
      for i := 0 to jsArr.Size - 1 do begin 
       writeln('element ', i); 
       // i-th object 
       jso := jsArr.Get(i) as TJsonObject; 

       //enumerate object fields 
       for jsPair in jso do begin 
        writeln(' ', jsPair.JsonString.Value, ': ', jsPair.JsonValue.Value); 
       end; 
      end; 
     finally 
      jsv.Free(); 
      readln; 
     end; 
    except 
     on E: Exception do 
      Writeln(E.ClassName, ': ', E.Message); 
    end; 
end.