2012-05-11 42 views
7

Cố gắng hiểu JSON trong Delphi. Sử dụng mô-đun "DBXJSON.pas". Làm thế nào để sử dụng nó để làm cho một mảng như thế này:Delphi: mảng JSON

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

Làm như vậy:

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); 

, nhưng có được điều này:

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

Xin giúp! Cảm ơn!

+1

Có những lợi thế rõ ràng khi sử dụng bất kỳ thứ gì được gửi cùng với Delphi, nhưng nếu bạn định làm nhiều thứ JSON, bạn thực sự nên xem SuperObject. Thật tuyệt vời theo nhiều cách. http://code.google.com/p/superobject/source/checkout –

+0

Bạn tuyên bố muốn có một giá trị trong đối tượng '1_1'. Đó không phải là giá trị Javascript hợp lệ. Chữ số không được phép chứa dấu gạch dưới. (Chúng được cho phép trong Java và Perl, nhưng không phải Javascript.) Vui lòng làm rõ những gì bạn thực sự muốn, bởi vì khi câu hỏi của bạn hiện đang xuất hiện, những gì bạn muốn không thực sự là JSON, vì vậy bạn không nên sử dụng thư viện JSON. –

Trả lời

10

Mã, mà bạn đã đăng ở trên, không chính xác. Bạn đã tạo một JSON-Array và cố gắng thêm các phần tử cặp vào mảng đó. Tuy nhiên, thay vì thêm cặp vào mảng, bạn phải thêm JSON Objects vào mảng này và các đối tượng này phải chứa các cặp của bạn.
đây là một số mẫu mã để giải quyết vấn đề của bạn:

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. 

và đầu ra được

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

Cùng câu trả lời như @teran:

thay đổi:

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

để:

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

Chúc mừng.

+0

Phương thức 'AddElement' mong đợi một' TJSONValue', nhưng 'TJSONPair' không phải là một lớp con của' TJSONValue', do đó mã được đề xuất của bạn thậm chí sẽ không biên dịch. Đầu ra mong muốn là cho mảng chứa giá trị. Bạn đang cố thêm cặp trực tiếp vào mảng, nhưng các cặp không phải là giá trị. Vậy, câu trả lời của bạn giống Teran như thế nào? –

+0

@Rob Kennedy Ok, đã xảy ra lỗi, ý tưởng đã xóa đối tượng cấp phụ – umlcat