
Часто при тестировании web service приходится из формата Json получить object в Java, и обратно. Существует множество способов, я пользуюсь библиотекой Jackson.
Задание:
Из файла json получить Java объекты.
Для валидации Json использовать сайт Jsonlint.
Для описание модели использовать библиотеку Lombok.
Создать БД MsSql для тестирования. Написать тесты Junit 5, использовать параметризацию.
Залогировать все в файл с библиотекой log4j.
Использовал:
Jackson | Junit 5 | Lombok |
MySQL | MAMP | log4j |
Для примеров Json (JavaScript Object Notation) и общего развития использовал сайт: json-schema.
{ "id": 1, "name": "A green door", "price": 12.50, "tags": ["home", "green"] } |
Описываем модель данного файла json в Java class. Используем аннотации @Setter и @Getter от библиотеки Lombok. Хорошо чистит код и избавляет от избыточности. Вариант с ручным описанием хорош, а если у нас задание и json файл состоит из 1500 строчек в уровнем вложенности 5, ответ есть, в конце статьи покажу как я использую авто генерацию Java классов по json.
@Setter @Getter public class MyPojo { public int id; public String name; public float price; public String tags[]; } |
Далее в классе App используем Jackson Object Mapper.
public static void main(String[]arg){ ObjectMapper mapper = new ObjectMapper(); MyPojo myPojo2 = mapper.readValue(jsonString, MyPojo.class); LOGGER.info(myPojo2.getTags()[1]); |
Еще один пример Json с массивом.
[{ "id": 1, "first_name": "Gary", "last_name": "James", "birthday": "1986-01-27", "email": "gary@yahoo.com", "phone": "183-137-1605", "job": "Software Developer" }, { "id": 2, "first_name": "Tom", "last_name": "Soyer", "email": "soyer@yahoo.fr", "gender": "Male", "ip_address": "44.56.12.44" }] |
Описание модели ни чем не отличается. Класс App в данном случае:
ObjectMapper mapper = new ObjectMapper(); try { MyPojo2[] myPojo2 = mapper.readValue(new File( "D:\\JAVA\\Java_SRC\\Json2Object\\src\\main\\resources\\advancedSample.json"), MyPojo2[].class); for(MyPojo2 pojo2 : myPojo2){ LOGGER.info(pojo2.getFirst_name()+ " " + pojo2.getLast_name()+ ". " + "Email: " +pojo2.getEmail()); } |
С получением Java объектов из Json файлов разобрались. Далее получаем Json из объектов. Для примера берём json файл. Задача описать данный пример и вывести его в консоль. Описываем каждый элемент.
{ "$schema": "http://json-schema.org", "title": "Product", "description": "A product from Acme's", "type": "object", "properties": { "id": { "description": "The unique identifier for a product", "type": "integer" }, "name": { "description": "Name of the product", "type": "string" }, "price": { "type": "number", "minimum": 0, "exclusiveMinimum": true }, "tags": { "type": "array", "items": { "type": "string" }, "minItems": 1, "uniqueItems": true } }, "required": ["id", "name", "price"] } |
Тут задача, корректно описать модель данного json файла, с учетом вложенных элементов.
@Getter @Setter public class MyPojoAdvanced { public String $schema; public String title; public String description; public String type; public Properties properties; public String [] required; public String get$schema() { return $schema; } public void set$schema(String $schema) { this.$schema = $schema; } } @Getter @Setter public class Properties { public Id id; public Name name; public Price price; public Tags tags; } @Getter @Setter public class Id { public String description; public String type; } |
Далее в main классе по сути все просто, с помощью Object Mapper смапим в строку наши объекты и в консоли выводим Json код.
ObjectMapper mapper = new ObjectMapper(); MyPojoAdvanced pojoAdvanced = createModel(); try { String jsonString = mapper.writeValueAsString(pojoAdvanced); System.out.println(jsonString); } catch (IOException e) { e.printStackTrace(); } |
И в методе createModel() соберем нашу модель.
private static MyPojoAdvanced createModel() { MyPojoAdvanced pojoAdvanced = new MyPojoAdvanced(); pojoAdvanced.set$schema("http://json-schema.org"); pojoAdvanced.setTitle("Product"); pojoAdvanced.setDescription("A product from Acme's"); pojoAdvanced.setType("object"); //set ID Id id = new Id(); id.setDescription("The unique identifier for a product"); id.setType("integer"); ........................................................ return pojoAdvanced; } |
Пример с ручным описанием модели json файла. Также полезно использовать авто генерацию Java классов. Я пользуюсь online сервисом jsongen. Вставляем исходный json код, в нижнем окне получаем модель – java классы. Под наши нужды вносим коррективы в классы.
На выходе получаем два класса с описанием модели. Создаем главный класс для проверки. Получим объекты из json файла тремя способами: из файла, по ссылке, из строки.
{ "name": { "first": "Joe", "last": "Sixpack" }, "gender": "MALE", "verified": false, "userImage": "Rm9vYmFyIQ==" } |
File jsonFile = new File("D:\\JAVA\\Java_SRC\\Json2Object\\src\\main\\resources\\user.json"); URL jsonUrl = new URL("https://gist.githubusercontent.com/MuflikhunovRR/bc84c50022389b4ca0a52b3606594e44/raw/ae5e8fe7898adc0eff53abb4a591222c34dc11d1/user.json"); String jsonStr = "{\"name\":{\"first\":\"Joe\",\"last\":\"Sixpack\"},\"gender\":\"MALE\",\"verified\":false,\"userImage\":\"SSBsb3ZlIE15IEZhbWlseSAh\"}"; User user = null; ObjectMapper mapper = new ObjectMapper(); user = mapper.readValue(jsonFile, User.class); LOGGER.info(user.getName().getFirst()); user = mapper.readValue(jsonUrl, User.class); LOGGER.info(user.getName().getLast()); user = mapper.readValue(jsonStr, User.class); LOGGER.info(user.getGender()); LOGGER.info(new String(user.getUserImage())); |
Опубликовать свой json файл быстро, можно с помощью сервиса на Git gist.
С задачей справились, теперь приступим к тестированию Junit 5.
Для примера, напишу несколько unit тестов и модульных. Создадим БД и наполним ее тестовыми данными.
CREATE TABLE Person ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(150), last_name VARCHAR(150), birthday DATE, email VARCHAR(150), phone VARCHAR(150), job VARCHAR(150) ); |
Вводные данные:
Имеется некий web service, который возвращает json с набором данных, происходит запись в файл. Существует эталонное значение в БД. Необходимо убедится, что web service передает в json файл корректные значения.
[{ "id": 1, "first_name": "Giulietta", "last_name": "Capuleti", "birthday": "1597-01-27", "email": "giulietta@yahoo.it", "phone": "255-145-1605", "job": "Unemployed" }, { "id": 2, "first_name": "Emilia", "last_name": "Clarke", "birthday": "1986-10-23", "email": "daenerys_targaryen@yahoo.com", "phone": "565-137-5896", "job": "Actress" }, { "id": 3, "first_name": "Lena", "last_name": "Headey", "birthday": "1973-10-03", "email": "cersei_lannister@hollywood.com", "phone": "336-150-5147", "job": "Actress" }] |
Тесты:
Ссылка на GitHub:
Github Json To Object Project