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.