Delphi: доступ к объектам JSON в массиве JSON

у меня есть объект JSON, назовем его jObject, который выглядит так:

{
  "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}]"
}

как вы можете видеть, он содержит две пары, одна из которых является массивом с тремя объектами в этом случае (количество объектов является динамическим) с несколькими "ключами: значениями"(они не меняются, всегда одни и те же 5 полей), которые я хочу вставить в базу данных SQL, "ключ" - столбец, "значение" - поле. Вопрос в том, как получить доступ к каждому объекту в отдельности?

code-wise то, что я сделал, было экстракт пара, которая содержала этот массив в jPair

jPair := OriginalObject.Get(1); 

а затем захватили массив

jArray:= TJSONArray(jPair.JsonValue);

(также, как бонус, когда я оцениваю jArray.Размер, результат 6226004. Что?)

2 ответов


если у вас есть массив из DBXJSON, то это TJSONArray. Назовите его Get метод для получения элемента массива.

var
  Value: TJSONValue;

Value := jArray.Get(0);

вы также можете пройти через весь массив с for петли:

for Value in jArray do

но если вы проверите Size свойство и получить 6226004 вместо 3, что предполагает, что здесь что-то не так. Я предполагаю, что то, что вы думаете, является TJSONArray на самом деле это не тот тип. Использовать as сделать проверенный тип В ролях:

jArray := jPair.JsonValue as TJSONArray;

вы получаете EInvalidCast исключение, если это не удается.


вот пример кода для анализа и вывода данных json. Я изменил ваши данные JSON и добавил ArrayData поле, которое содержит ваш начальный массив объектов:

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.