Delphi: доступ к объектам JSON в массиве JSON - PullRequest
6 голосов
/ 08 марта 2012

У меня есть объект 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, "ключ" - это столбец, "значение" - это поле. Вопрос в том, как мне получить доступ к каждому объекту индивидуально?

В коде я извлек пару, содержащую этот массив, поместив ее в jPair

jPair := OriginalObject.Get(1); 

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

jArray:= TJSONArray(jPair.JsonValue);

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

Ответы [ 2 ]

8 голосов
/ 08 марта 2012

Если у вас есть массив из 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.

6 голосов
/ 08 марта 2012

вот пример кода для анализа и вывода ваших данных 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.
...