Разбираемся с данными JSON |
23.04.2019 00:00 |
Автор: Кристин Джеквони (Kristin Jackvony) Новички 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 плохо расставлены, вставьте его на эту страничку, и она отформатирует все за вас. |