Обработка JSON в Delphi: проверка ключа error для условного выполнения действий
При работе с JSON в Delphi часто возникает необходимость проверки наличия определённых ключей. В данном примере рассматривается задача проверки наличия ключа error в JSON-объекте для условного выполнения действий в цикле.
Проблема
Пользователь столкнулся с необходимостью проверить, содержит ли текущий объект JSON ключ error. Если ключ присутствует, программа должна пропустить текущий объект (используя continue), а если его нет — продолжить обработку.
Пользователь пытался использовать методы FindValue и TryGetValue для поиска ключа error, но столкнулся с проблемами:
jValue.FindValue('error') // Поиск по всему массиву.
jValue.TryGetValue('error', jArray) // Прерывание программы, если ключ не найден в текущем объекте.
Решение
Проблема в том, что jValue указывает на TJSONArray, и вызов TryGetValue('error') пытается найти поле error непосредственно в массиве, что некорректно. Вместо этого нужно обращаться к каждому объекту в массиве отдельно:
response := IdHTTP.Get(url);
try
jValue := TJsonObject.ParseJSONValue(response);
jArray := jValue as TJSONArray;
for x := 0 to jArray.Count-1 do
begin
jObj := jArray[x] as TJSONObject;
if jObj.GetValue('error') = nil then
begin
// Ключ 'error' отсутствует, выполняем необходимые действия.
Memo.Lines.Add('cod_item :' + jObj.GetValue('item').Value);
Memo.Lines.Add('cod: ' + jObj.GetValue('cod').Value);
end;
end;
finally
jValue.Free;
end;
Альтернативный подход
Также можно использовать метод FindValue, указывая индекс объекта в массиве:
response := IdHTTP.Get(url);
try
jValue := TJsonObject.ParseJSONValue(response);
jArray := jValue as TJSONArray;
for x := 0 to jArray.Count-1 do
begin
if jArray.FindValue('['+IntToStr(x)+'].error') = nil then
continue;
// Ключ 'error' присутствует, пропускаем текущий объект.
end;
Memo.Lines.Add('cod_item :' + jArray.GetValue<string>('['+IntToStr(x)+'].item'));
Memo.Lines.Add('cod: ' + jArray.GetValue<string>('['+IntToStr(x)+'].cod'));
end;
finally
jValue.Free;
end;
Важные замечания
При работе с TJSONArray необходимо обращаться к каждому объекту массива отдельно.
Использование методов GetValue и FindValue с указанием индекса позволяет корректно проверить наличие ключа в каждом объекте массива.
При использовании исключений для проверки наличия значения, можно использовать более лёгкие альтернативы, такие как TJSONObject.Get() или TJONObject.Pairs[], чтобы избежать накладных расходов на обработку исключений.
Эти рекомендации помогут разработчикам избежать типичных ошибок при работе с JSON в Delphi и обеспечат корректную обработку JSON-данных.
При работе с JSON в Delphi необходимо обращаться к каждому объекту в массиве отдельно для проверки наличия определенных ключей, таких как `error`, чтобы корректно обрабатывать условные действия в цикле.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.