Многие люди на форуме Katalon спрашивали о получении информации из ответов JSON и анализе формата JSON в Katalon Studio. В этом посте я покажу простой способ, как это сделать.

Пример ответа JSON

Предположим, у нас есть следующий ответ JSON, и мы хотим проанализировать и получить его данные:

{"menu": {
"id": "file",
"tools": {
"actions": [
{"id": "new", "title": "New file"},
{"id": "open", "title": "Open File"},
{"id": "close", "title": "Close File"}
],
"errors": []
}}}

JsonSlurper

Мы используем этот вспомогательный класс Groovy для анализа строк JSON. Нам нужно создать новый экземпляр JsonSlurper и вызвать метод JsonSlurper.parseText. Образец кода:

import groovy.json.JsonSlurper
 
String jsonString = '''{"menu": {
"id": "file",
"tools": {
"actions": [
{"id": "new", "title": "New File"},
{"id": "open", "title": "Open File"},
{"id": "close", "title": "Close File"}
],
"errors": []
}}}'''
JsonSlurper slurper = new JsonSlurper()
Map parsedJson = slurper.parseText(jsonString)
import groovy.json.JsonSlurper
 
String jsonString = '''{"menu": {
"id": "file",
"tools": {
"actions": [
{"id": "new", "title": "New File"},
{"id": "open", "title": "Open File"},
{"id": "close", "title": "Close File"}
],
"errors": []
}}}'''
JsonSlurper slurper = new JsonSlurper()
Map parsedJson = slurper.parseText(jsonString)

Проанализированный ответ JSON теперь хранится в переменной с именем parsedJson (в нашем случае это структура данных Map, но иногда это может быть что-то другое).

JsonSlurper также предоставляет несколько методов перегрузки JsonSlurper.parse, которые можно использовать, если входными данными JSON являются File, Reader, InputStream, URL, отличный от String. Дополнительную информацию см. в документации JsonSlurper.

Получить ключевое значение

Предположим, вы хотите получить значение id из приведенного выше ответа JSON. JSON — это структурированный документ, поэтому вы можете получить любой элемент, используя его абсолютный путь. См. этот пример:

String idValue = parsedJson.menu.id
 
String idValue2 = parsedJson.get("menu").get("id")

Как видите, есть два способа, как его получить. Одним из них является доступ к объектам карты с помощью записи через точку (.). Другой способ — использовать методы get из Map, List и Set, как в Java.

По сути, переменная parsedJson представляет собой тип Map‹String, Map‹Object, Object». Затем, чтобы получить внутреннюю карту, вы вызываете parsedJson.get("menu") — поскольку "menu" является строковым ключом. Этот метод возвращает внутреннюю карту, для которой вы можете вызывать другие методы получения, пока не достигнете своего ключа.

Проверьте, присутствует ли ключ в JSON

Если вы хотите проверить, присутствует ли выбранный ключ в ответе JSON, вы можете использовать аналогичный код, как показано ниже:

import com.kms.katalon.core.util.KeywordUtil
 
String getSelectedKey = parsedJson.menu.id
 
if(getSelectedKey == null) {
KeywordUtil.markFailed("Key is not present")
}
It is a simple check for null – if the given key is not found, null is returned. But there is one special case when this code won't work, that is, if key "id" has value null in your JSON. For such cases you should use more robust code:
boolean isKeyPresent = parsedJson.get("menu").keySet().contains("id")
 
if (!isKeyPresent) {
KeywordUtil.markFailed("Key is not present")
}

Вы получаете все ключи из объекта «меню», а затем проверяете, содержит ли он ключ, который вы ищете.

Получить элемент массива

Ваш ответ JSON также может содержать массивы. Как и любой массив в Java или Groovy, вы можете получить доступ к элементу массива, используя имя_массива[index].

Например, мы можем получить значение «заголовок» первого объекта в массиве «действия», как показано ниже.

String idValue = parsedJson.menu.tools.actions[0].title
 
String idValue2 = parsedJson.get("menu").get("tools").get("actions").get(0).get("title")

В этом примере мы обращаемся к элементу с индексом 0, первому элементу в массиве (индекс отсчитывается от нуля).

Получить элемент массива на основе некоторого условия

Более обычный случай — это когда вы хотите получить точный элемент массива на основе какого-то конкретного условия. Например, вы получаете значение «заголовок» объекта, чей «id» равен «Открыть». Вы можете сделать это, как показано ниже:

def array1 = parsedJson.menu.tools.actions
 
String onlickValue1 = ""
 
for(def member : array1) {
if(member.id == 'Open') {
onlickValue1 = member.title
break
}
}

В этом случае я использовал цикл for-each. Этот цикл проверяет каждый элемент массива array1 до тех пор, пока не будет выполнено условие. Если это так, onlickValue1 присваивается заголовку элемента.

Типы данных JSON

Формат JSON поддерживает несколько типов данных, таких как строка, число, логическое значение и нуль. Если вы не уверены, что это за тип данных, вы можете просто использовать ключевое слово def.

def myVar = 'get value from json here'.

Эмпирическое правило заключается в том, что строковое значение заключается в кавычки, числа без кавычек (также могут присутствовать числа с плавающей запятой) и логическое значение true или false. Но инициализация переменной с помощью def всегда является хорошим выбором, если вы не уверены в ее типе.

Вывод

В этом руководстве предлагаются несколько основных рекомендаций по работе со строками JSON в Katalon Studio. JSON является наиболее распространенным форматом, возвращаемым из API/Web Service. При выполнении тестирования API вам, вероятно, придется иметь дело с ответами JSON. Надеемся, что эти основные рекомендации будут полезны для тестирования вашего API.

Исходный источник: https://docs.katalon.com/katalon-studio/tutorials/parse_json_responses.html#get-an-array-element-based-on-some-condition