2012-03-07 81 views
6

Tengo un objeto JSON, vamos a lo nombra jobject que tiene este aspecto:Delphi: Acceso a JSON objetos dentro de una matriz 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}]" 
} 

Como se puede ver, que contiene dos pares, uno de los cuales es una matriz con tres objetos en este caso (la cantidad de objetos es dinámica) con múltiples "claves: valores" (estos no varían, siendo siempre los mismos 5 campos), que quiero insertar en una base de datos SQL, siendo "clave" columna, "valor" es campo. La pregunta es, ¿cómo accedo a cada objeto individualmente?

Código en cuanto a lo que hice fue extraer el par que contenía esta matriz poniéndolo en jPair

jPair := OriginalObject.Get(1); 

y luego capturó la matriz

jArray:= TJSONArray(jPair.JsonValue); 

(También, como un bono, cuando Evalúo jArray.Size, el resultado es 6226004. ¿Qué?)

+0

¿Tienes algún código? –

+0

Estoy usando XE2 con DBXJSON y DBXJSONReflect. – bpromas

+0

Originalmente tenía un JSONObject diferente, así que, básicamente, en lo que respecta al código, lo que hice fue extraer el par que contenía esta matriz colocándolo en jPair (dtPair: = OriginalObject.Get (1);) y luego capturé la matriz (jArray: = TJSONArray (jPair.JsonValue);) (¿Debo poner este código en la publicación original?) – bpromas

Respuesta

8

Si tiene una matriz de DBXJSON, entonces es TJSONArray. Llame a su método Get para obtener un elemento de la matriz.

var 
    Value: TJSONValue; 

Value := jArray.Get(0); 

También puede ir a través de toda la matriz con un for bucle:

for Value in jArray do 

Pero si se comprueba la propiedad Size y obtener 6.226.004 en lugar de 3, que sugiere que hay algo más equivocado aquí. Supongo que lo que piensas que es TJSONArray no es realmente ese tipo. as utilizar para hacer una conversión de tipo verificado:

jArray := jPair.JsonValue as TJSONArray; 

Usted obtendrá una excepción EInvalidCast si eso no funciona.

+0

De hecho, recibí una excepción EInvalidCast. ¿Eso significa que la matriz que tengo en mi JsonObject no es en realidad una matriz? Trabajar con JSON se está convirtiendo cada vez más en una batalla cuesta arriba. – bpromas

+1

Significa que no es un TJSONArray. El depurador debería poder decirle lo que realmente es. Si el depurador no te dice en una información sobre herramientas, entonces muestra el resultado de llamar 'jPair.JsonValue.ClassName'. –

+0

Sí, es un TJSONString, y uno mal formateado. ¿Cómo demonios voy a analizar esto? – bpromas

5

aquí hay un código de ejemplo para analizar y generar sus datos json. Modifiqué tus datos JSON y agregué el campo ArrayData, que contiene tu conjunto inicial de objetos:

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.