Intereting Posts
SQL, который возвращает все перестановки суммированного столбца Временная метка JDBC и даты по Гринвичу «Буферизация» ввода данных в онлайн-форму в случае разъединения (Racket) Почему LEFT JOIN приводит к тому, что ошибка «многочастный идентификатор не может быть связана», когда INNER JOIN не работает? Панды оставили внешнее соединение нескольких кадров данных на нескольких столбцах Ошибка подключения в SQL Server 2005 Преобразование значения nvarchar '3001822585' переполняет колонку int Нарушение ограничения целостности в пользовательском модуле Magento Есть ли функция, которая занимает год, месяц и день, чтобы создать дату в PostgreSQL? Django, ManyToManyField – ProgrammingError: отношение foo_bar не существует. Признается в миграциях, хотя отношение никогда не создается Получение группы MySQL по запросу для отображения строки в этой группе с наивысшим значением Oracle: Как получить порядковый номер только что вставленной строки? Выполнение сравнения LIKE в поле INT Сохраненная процедура без курсоров Как получить следующий идентификатор автоинкремента в mysql

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

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

 jPair := OriginalObject.Get(1); 

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

 jArray:= TJSONArray(jPair.JsonValue); 

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

Если у вас есть массив из DBXJSON, то это TJSONArray . Вызовите его метод Get чтобы получить элемент массива.

 var Value: TJSONValue; Value := jArray.Get(0); 

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

 for Value in jArray do 

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

 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.