2012-03-07 70 views
6

Tôi có một đối tượng JSON, chúng ta hãy đặt tên cho nó jObject trông như thế này:Delphi: Truy cập JSON đối tượng trong một mảng 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}]" 
} 

Như bạn thấy, nó có chứa hai cặp, một trong số đó là một mảng với ba đối tượng trong trường hợp này (số lượng đối tượng là động) với nhiều "khóa: giá trị" (chúng không thay đổi, luôn luôn là 5 trường giống nhau), mà tôi muốn chèn vào cơ sở dữ liệu SQL, "khóa" cột, "giá trị" là trường. Câu hỏi là, làm cách nào để truy cập từng đối tượng riêng lẻ?

Code-khôn ngoan những gì tôi đã làm là trích xuất các cặp có chứa mảng này bằng cách đặt nó trong jPair

jPair := OriginalObject.Get(1); 

và sau đó chiếm được mảng

jArray:= TJSONArray(jPair.JsonValue); 

(Ngoài ra, như một phần thưởng, khi Tôi đánh giá jArray.Size, kết quả là 6226004. Cái gì?)

+0

Bạn có mã nào không? –

+0

Tôi đang sử dụng XE2 với DBXJSON và DBXJSONReflect. – bpromas

+0

tôi ban đầu đã có một JSONObject khác nhau, vì vậy về cơ bản mã khôn ngoan những gì tôi đã làm là trích xuất các cặp có chứa mảng này bằng cách đặt nó trong jPair (dtPair: = OriginalObject.Get (1);) và sau đó bị bắt mảng (jArray: = TJSONArray (jPair.JsonValue);) (Tôi có nên đặt mã này trong bài đăng gốc không?) – bpromas

Trả lời

8

Nếu bạn có một mảng từ DBXJSON, thì nó là TJSONArray. Gọi phương thức Get để nhận phần tử của mảng.

var 
    Value: TJSONValue; 

Value := jArray.Get(0); 

Bạn cũng có thể đi qua toàn bộ mảng với một vòng lặp for:

for Value in jArray do 

Nhưng nếu bạn đánh dấu vào Size tài sản và nhận được 6.226.004 thay vì 3, cho thấy có điều gì đó khác sai đây. Tôi đoán là những gì bạn nghĩ là TJSONArray không thực sự là loại đó. Sử dụng as để làm một loại diễn viên kiểm tra:

jArray := jPair.JsonValue as TJSONArray; 

Bạn sẽ nhận được một ngoại lệ EInvalidCast nếu thất bại.

+0

Thật vậy, tôi có ngoại lệ EInvalidCast. Điều đó có nghĩa là mảng tôi có trong JsonObject của tôi không thực sự là một mảng? Làm việc với JSON đang ngày càng trở nên một trận chiến khó khăn hơn. – bpromas

+1

Nó có nghĩa là nó không phải là một TJSONArray. Trình gỡ lỗi sẽ có thể cho bạn biết nó thực sự là gì. Nếu trình gỡ rối không cho bạn biết trong một mẹo công cụ, sau đó hiển thị kết quả của việc gọi 'jPair.JsonValue.ClassName'. –

+0

Vâng, đó là TJSONString và một phiên bản được định dạng sai. Làm thế nào heck tôi sẽ phân tích thông qua điều này? – bpromas

5

đây là một số mẫu mã để phân tích và đầu ra dữ liệu json của bạn. Tôi đã sửa đổi dữ liệu JSON của bạn và thêm trường ArrayData, chứa mảng đối tượng ban đầu của bạn:

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. 
Các vấn đề liên quan