Разделы портала

Онлайн-тренинги

.
Разбираемся с данными JSON
23.04.2019 00:00

Автор: Кристин Джеквони (Kristin Jackvony)
Оригинал статьи: http://thethinkingtester.blogspot.com/2018/05/understanding-json-data.html
Перевод: Ольга Алифанова.

Новички API-тестирования зачастую с удивлением смотрят на зоопарк фигурных скобок, кавычек и запятых, приходящих в теле ответа на GET-запросы. Создание правильного JSON-тела для POST-запроса пугает еще больше. В этот раз мы обсудим, как формируются JSON-данные, и я предложу вам ресурсы, облегчающие работу с JSON.

JSON расшифровывается как JavaScript Object Notation. Это просто способ организации данных таким образом, чтобы они легко парсились через код. Основной кирпичик JSON – это пара имя-значение. Вот ряд примеров:

"Name": "Dino"
"Color": "Purple"

Группа пар имя-значение разделяется запятыми, вот так:

"FirstName": "Fred",
"LastName": "Flintstone",
"City": "Bedrock"

Заметим, что последняя пара имя-значение не кончается запятой, потому что завершает группу.

Объект – это группировка одной или более пар. Объект заключается в фигурные скобки, окружающие пары имен-значений. К примеру, объект "питомец" может быть представлен так:

{
  "Name": "Dino",
  "Type": "Dinosaur",
  "Age": "5",
  "Color": "Purple"
}

Массив – это группа объектов. Массив заключается в квадратные скобки, а объекты внутри него – в фигурные, например, так:

"residents": [
  {
    "FirstName": "Fred",
    "LastName": "Flintstone"
  },
  {
    "FirstName": "Barney",
    "LastName": "Rubble"
  },
  {
    "FirstName": "Wilma",
    "LastName": "Flintstone"
  }
]

Отметим, что фамилия Фреда Флинстоуна не имеет после себя запятой, потому что LastName – это последняя пара имя-значение в объекте. Однако объект, содержащий Фреда Флинстоуна, имеет после себя запятую, потому что в массиве еще есть объекты. И, наконец, обратим внимание, что после объекта "Вилма Флинстоун" запятой нет: это последний объект массива.

Не только массив может содержать объекты: объект тоже может содержать массив. Когда вы отправляете JSON в теле запроса API, это всегда объект, а это значит, что он всегда будет заключен в фигурные скобки. Пары имен и значений, объекты и массивы могут иметь очень глубокие уровни вложенности. Ничего удивительного в таких, например, запросах нет (POST для данных о городе):

{
  "residents": [
    {
      "firstName": "Fred",
      "lastName": "Flintstone",
      "contactInfo": {
        "phoneNumber": "555-867-5309",
        "email": "
 Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
 "
      }
    },
    {
      "firstName": "Wilma",
      "lastName": "Flintstone",
      "contactInfo": {
        "phoneNumber": "555-423-4545",
        "email": "
 Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
 "
      }
    }
  ],
  "pets": [
    {
      "name": "Dino",
      "type": "dinosaur",
      "color": "purple"
    },
    {
      "name": "Hoppy",
      "type": "hopparoo",
      "color": "green"
    }
  ]
}

Обратите внимание, что contactInfo находится очень глубоко в объекте city. Если бы мы тестировали это API, и вы хотели бы убедиться, что у Фреда Флинстоуна указан верный телефонный номер, его можно было бы получить таким образом:

residents[0].contactInfo.phoneNumber

Первый массив в объекте – это массив residents, а Фред – первый резидент массива, поэтому мы находим его при помощи residents[0]. Далее мы перемещаемся в contactInfo, а так как это объект, нам не нужно указывать его номер в скобках. И, наконец, мы указываем, что ищем phoneNumber – пару имя-значение, находящуюся внутри объекта contactInfo.

Понимание вложенной структуры очень важно для передачи параметров запроса в URL. К примеру, если нам нужен GET-запрос объекта города, и мы хотим получить только жителей в результате, мы можем использовать такой URL:

http://myapp/city/Bedrock?fields=residents

Если мы хотим отфильтровать результаты еще сильнее и получить только имена и почты наших резидентов, то URL будет таким:

http://myapp/city/Bedrock?fields=residents(firstName), residents(contactInfo(email))

Вначале мы запрашиваем только жителей, а потом указываем, что нам нужно только firstName из массива резидентов. Затем мы запрашиваем резидентов и указываем, что нам нужна только contactInfo и только почта из contactInfo.

Даже учитывая все эти разъяснения, работа с JSON может показаться сложной. Вот пара отличных бесплатных инструментов, которые могут вам помочь:

JSONLint – вставьте сюда любой JSON, и инструмент скажет вам, валиден ли он. Если он невалиден, он сообщит вам, на какой строке это произошло.

JSON Pretty Print –  зачастую сложно форматировать JSON так, чтобы все отступы были на нужных местах. Отступы к тому же упрощают чтение JSON. Если отступы в вашем JSON плохо расставлены, вставьте его на эту страничку, и она отформатирует все за вас.

Обсудить в форуме