2012-05-11 63 views
7

Tratando de entender el JSON en Delphi. Usando el módulo "DBXJSON.pas". Cómo se usa para hacer de este una gama tan amplia:Delphi: array JSON

Array:[ 
     {"1":1_1,"1_2_1":1_2_2}, 
     ..., 
    ] 

Si lo hace:

JSONObject:=TJSONObject.Create; 
JSONArray:=TJSONArray.Create(); 
... 
JSONArray.AddElement(TJSONObject.Create(TJSONPair.Create('1','1_1'))); 
JSONArray.AddElement(TJSONObject.Create(TJSONPair.Create('1_2_1','1_2_2'))); 
JSONObject.AddPair('Array',JSONArray); 

, pero conseguir esto:

{ 
"Array":[ 
{"1":"1_1"},{"1_2_1":"1_2_2"} 
] 
} 

Por favor, ayuda! Gracias!

+1

Existen ventajas obvias en el uso de lo que se envía con Delphi, pero si va a hacer muchas cosas de JSON, debería echar un vistazo a SuperObject. Es impresionante de muchas maneras. http://code.google.com/p/superobject/source/checkout –

+0

Declaras querer un valor en tu objeto de '1_1'. Ese no es un valor de Javascript válido. Los literales numéricos no pueden contener guiones bajos. (Están permitidos en Java y Perl, pero no en Javascript.) Por favor aclare lo que realmente quería, porque como su pregunta actualmente aparece, lo que quiere realmente no es JSON, por lo que no debería usar una biblioteca JSON. –

Respuesta

10

El código, que ha publicado anteriormente, no es correcto. Has creado una matriz JSON e intentas agregar elementos par a esa matriz. Pero, en lugar de agregar pares a la matriz, debe agregar JSON Objects a esta matriz, y estos objetos deben contener sus pares.
aquí es un código de ejemplo para resolver su problema:

program Project3; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, dbxjson; 

var jsobj, jso : TJsonObject; 
    jsa : TJsonArray; 
    jsp : TJsonPair; 
begin 
    try 
    //create top-level object 
    jsObj := TJsonObject.Create(); 
    //create an json-array 
    jsa := TJsonArray.Create(); 
    //add array to object 
    jsp := TJSONPair.Create('Array', jsa); 
    jsObj.AddPair(jsp); 

    //add items to the _first_ elemet of array 
    jso := TJsonObject.Create(); 
    //add object pairs 
    jso.AddPair(TJsonPair.Create('1', '1_1')); 
    jso.AddPair(TJsonPair.Create('1_2_1', '1_2_2')); 
    //put it into array 
    jsa.AddElement(jso); 

    //second element 
    jso := TJsonObject.Create(); 
    //add object pairs 
    jso.AddPair(TJsonPair.Create('x', 'x_x')); 
    jso.AddPair(TJsonPair.Create('x_y_x', 'x_y_y')); 
    //put it into array 
    jsa.AddElement(jso); 

    writeln(jsObj.ToString); 
    readln; 

    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

y la producción se

{"Array":[ 
    {"1":"1_1","1_2_1":"1_2_2"}, 
    {"x":"x_x","x_y_x":"x_y_y"} 
    ] 
} 
0

La misma respuesta que @teran:

cambio:

JSONArray.AddElement(TJSONObject.Create(TJSONPair.Create('1','1_1'))); 
JSONArray.AddElement(TJSONObject.Create(TJSONPair.Create('1_2_1','1_2_2'))); 

a:

JSONArray.AddElement(TJSONPair.Create('1','1_1')); 
JSONArray.AddElement(TJSONPair.Create('1_2_1','1_2_2')); 

Saludos.

+0

El método 'AddElement' espera un' TJSONValue', pero 'TJSONPair' no es una subclase de' TJSONValue', por lo que el código sugerido ni siquiera se compilará. El resultado deseado es que la matriz contenga un valor. Está intentando agregar pares directamente a la matriz, pero los pares no son valores. Entonces, ¿de qué manera tu respuesta es la misma que la de Teran? –

+0

@Rob Kennedy Ok, recibí un error, la idea era eliminar el objeto de nivel extra – umlcat

Cuestiones relacionadas