Json to Object Project

Часто при тестировании 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"
}]

Тесты:

  • Json файл не пуст;
  • Провалидировать Json. Есть библиотека от google gson;
  • Коллекция состоит из трех массивов данных;
  • Id начинается с 1 и заканчивается 3;
  • Все данные по каждому пользователю совпадают из файла с БД;
  • Имя и Фамилия каждого пользователя с заглавной буквы;
  • Формат даты рождения каждого пользователя: YYYY-MM-DD;
  • Провалидировать Email. К примеру с помощью RegExp – без фанатизма (.+@.+\..+);
  • У пользователя id = 1 и id = 2 email удовлетворяет маске: @yahoo и id = 3 нет;
  • Формат записи телефона удовлетворяет маске: DDD-DDD-DDDD;

    Ссылка на GitHub:
    Github Json To Object Project

  • Related Posts