Недавно нужно было написать API автотесты - запросы Post с большим количеством параметров в теле, в том числе вложенные JSON объекты, массивы , массивы JSON объектов. Многие параметры не обязательные, а значит - большое количество наборов тестовых данных. Дано: Датапровайдер - для многократного запуска тестов, тестовые данные в таблице Excel.  Что бы сформировать тело первого запроса пришлось создать несколько классов, через сеттеры присваивать значения переменным в классе и из базового класса формировать JSON, который и использовался как тело запроса. И вдруг оказалось, что все написанное никак не получится переиспользовать для других эндпоинтов. Тогда и решил написать метод, который будет превращать таблицу Excel в JSON объект без всяких там классов и правок в коде. Нужно только придерживаться некоторых правил при составлении таблицы.  Итак! Для получения данных из таблицы использовал, как обычно, Fillo. Название столбца будет ключом, значения в столбце, собственно, значениями ключа в запросе. Строка таблицы - один набор тестовых данных. Должно быть как-то так на входе: shop_name сity shop#1 Charkiv shop#2 Kyiv shop#3 Dnipro На выходе: Для начала, метод для получения ВСЕХ данных из Excel листа в виде массива мапов. Раньше использовал для похожих задач для вебтестов. Метод принимает две строки: путь к Excel файлу и название листа. Это единственные константы, которые вам придется захардкодить, все остальное управление формированием тела запроса выполняется из Excel файла. Я создаю для этого класс констант и там, если необходимо, меняю значение, которое потом используется во всех тестах. результат:  Превратить мапу в JSON с помощью GSON можно за одно действие, но тут оказалось, что сервер не принимает пустые ключи, поэтому их нужно выпилить в процессе. Следующий метод принимает на вход массив из метода fromExcelToListOfMaps , удаляет ключи без значений и возвращает массив JSON строк.  На входе: shop_name сity shop#1 Charkiv  Kyiv shop#3  После первого метода: [{shop_name=shop#1, сity=Charkiv},  {shop_name=, сity=Kyiv},  {shop_name=shop#3, сity=}] На выходе: [{"shop_name":"shop#1","сity":"Charkiv"},  {"сity":"Kyiv"},  {"shop_name":"shop#3"}] В таком виде уже можно отправлять результат в датапровайдер, но у меня значения не только типа String. А как объяснить методу, что вот это вот boolean, а вот это Integer и кавычки тут не нужны, а там вообще массив JSON объектов. И в коде указывать нельзя, получится не универсально. Решил в название столбцов добавить ключевые слова: string - нет ключевого слова boolean - bool float - flo int - int Ключевое слово отделяется от имени ключа двумя звездочками (**). Теперь, после проверки на пустые значения, выполняется проверка на наличия ключевого слова в названии столбца, и, если это слово есть и соответствует одному из приведенных выше, создается новый ключ (отбрасывается ключевое слово и звездочки) и ему присваивается значение с приведением к нужному типу данных. Выглядит примерно так: после чего из мапы выпиливаются все пары в ключе которых присутствуют ** . Т.е. если написать в таблице ключевое слово с ошибкой,  то эта колонка в запрос не попадет. В результате На входе: shop_name сity Int**employee_qty Bool**Sunday_off shop#1 Charkiv 3 true shop#2 Kyiv 3 true shop#3 Dnipro 2 false на выходе:  Конечно работать с разными типами данных в Map<String, String> не получится, поэтому все результаты пересобираются в переменную типа JsonObject.  Дальше нужно было добавить ключи со значениями класса JsonObject. Конечно можно просто в Excel ячейку записать что-то типа {"salary": 25.0,"bonus": 4.75}, но ведь у меня уже есть метод, который который соберет JSON из листа Excel. Нужно только указать лист и строку которая будет использоваться. Получилось чуть-чуть рекурсии. Ключевое слово: JsonObject - Если в качестве      значения ключа нужен JsonObject, то ключевое слово должно совпадать с      названием Excel листа, из которого берутся данные (добавил метод получающий все имена листов Excel файла в массив). Значение в ячейке (тип int) - номер строки в этом листе (нумерация с нуля). В результате на входе: На выходе:  Остались массивы. Наверное, стоило написать логику с нуля, но я поленился и решил из JsonObject и выбранной строки просто все значения перенести в List<Object> . Написал отдельный метод. На вход принимает путь к Excel файлу, имя листа и номер строки (нумерация с нуля) Ключевое слово:  List<Object> - arr. Имя столбца должно совпадать с  именем Excel листа, из которого будут браться значения для массива. Значение в ячейке (тип int) - номер строки. Имя столбцов в Excel листе из которого будут набираться данные в массив значения не имеют, но они не должны повторяться (Fillo не обработает) и для всех столбцов должно быть одинаковое ключевое слово. (для данных типа String ключевое слово не нужно). В результате как-то так на входе: На выходе:  Вот основной класс с методами: В общем по функционалу на этом все, осталось заполнить таблицу. Оказалось, что указывать номера строк, находящихся на другом листе, не очень-то и удобно, постоянно какая-то путаница. Тут мне на помощь пришли неправильные ключевые слова. Если в имени столбца присутствует две звездочки (**), но текст перед ** не соответствует одному из ключей, то этот столбец в запросе игнорируется, и в него можно писать комментарии, добавлять нумерацию, или выводить результаты теста. Я ставил четыре звездочки, чтобы сходу видеть, что в запрос не попадет. Таблицы стали выглядеть как-то так:  int**Id First_Name Last_Name int**Age Gender pay**paycheck com****coment 0 Wasja Smith 19 m 0 <--  Point off row****number from the sheet pay 1 Tanja Johnson 25 f 0 2 Ighor Williams 42 m 1 3 Masha Brown 19 f 1 4 Olja Davis 18 f 3 5 Oleg Miller 25 m 4 6 Kolja Wilson 21 m 3 7 Andrew Moore 20 m 1 row****numb flo**salary flo**bonus 0 20  1 25 4,75 2 22 4 3 33,3 5,8 4  100 Осталось передать все это в датапровайдер и превратить в классический двухмерный массив строк. И дальше в тест: Тело первого теста: Body: { "shop_name": "shop#1", "сity": "Charkiv", "income_per_month": [ 78500, 22222, 2222, 159 ], "employee_qty": 3, "employees": [ { "Id": 0, "First_Name": "Wasja", "Last_Name": "Smith", "Age": 19, "Gender": "m", "paycheck": { "salary": 20.0 } }, { "Id": 1, "First_Name": "Tanja", "Last_Name": "Johnson", "Age": 25, "Gender": "f", "paycheck": { "salary": 20.0 } }, { "Id": 2, "First_Name": "Ighor", "Last_Name": "Williams", "Age": 42, "Gender": "m", "paycheck": { "salary": 25.0, "bonus": 4.75 } } ], "work_time": "09,00-18,00", "Sunday_off": true, "goods": { "tobacco": true, "alcohol": true, "groshery": true, "weapons": false, "drugs": false } } Теперь, в случае если будут добавлены, удалены или изменены параметры, или тестовые данные,  мне даже не нужно будет заглядывать в код, только подправить табличку. Как и все универсальное, в обращении не очень удобно, но привыкнуть можно. Все это писалось в отдельном проекте, клонировать можно здесь. Можно подправить файл Data.xlsx под ваши нужды и позапускать тесты из класса ExampleTests , что бы посмотреть, получите ли вы то, что вам нужно. Если вы начинаете новый проект с API (+WEB) тестами, это можно использовать как шаблон. Если нужно применить в существующем проекте, но совсем не хочется разбираться как это устроено, то скопируйте пакеты api и файл Data.xlsx в соответствующие разделы вашего проекта на Maven + TestNG, при необходимости добавьте нужные зависимости и пишите тесты в классе ExampleTests. Собираюсь потихоньку перетянуть сюда все универсальные методы, которые использовал - пусть все лежит в одном месте! Надеюсь, что информация поможет другим начинающим автоматизаторам). QA-Engineer