Работа со структурированными данными

Работа со структурированными данными #

Во время работы веб-приложению зачастую необходимо выполнять обмен данными с жёстким диском и другими системами:

flowchart LR external_one("Внешняя\nсистема № 1") external_two("Внешняя\nсистема № 2") web_app("Веб-приложение") json_file>"JSON-документ\nна жёстком диске"] external_one -- Получение данных\nв формате JSON --> web_app web_app -- Отправка данных\nв формате JSON --> external_two web_app <-- Чтение и сохранение\nданных в формате JSON --> json_file

Если бы каждая система придумывала свой формат для описания данных, то в рамках представленного веб-приложения потребовалось бы поддержать не один формат, а три. Т.е. шансы ошибиться при реализации чтения и записи данных форматов было бы в три раза больше.

Использование стандартизированных форматов данных и проверенных библиотек, позволяющих считывать данные, позволяет:

  • Ускорять реализацию типичных задач внутри приложения.
  • Выполнять надёжный обмен данными между системами.
  • Ускоряет восприятие информации человеком, т.к. ему достаточно ознакомиться с одним подходом к описанию данных.

По окончании данной практической работы вы должны:

  • Знать синтаксис JSON-документов.
    • Знать синтаксис JSON-объектов.
    • Знать синтаксис JSON-массивов.
  • Уметь вручную формировать данные внутри JSON документа на жёстком диске.
  • Уметь считывать данные из JSON-документа.
  • Уметь записывать данные в JSON-документ.

Документация #

Подготовка. Создание проекта #

При создании проекта в IDEA будем использовать систему сборки Gradle. Для этого запустите мастер по созданию нового проекта и выберите следующие пункты:

  1. Укажите название проекта и его местоположение.
  2. Выберите язык программирования (Language): Java
  3. Выберите систему сборки (Build system): Gradle
  4. Выберите язык описания системы сборки (Gradle DSL): Groovy
  5. Оставьте настройку по добавлению автоматически созданного кода (Add sample code).

Дождитесь окончания операций по импорту проекта.

Завершите настройку проекта.

  1. Откройте файл конфигурации Gradle: build.gradle в корне проекта.
  2. Добавьте плагин application в список плагинов проекта. После добавления список плагинов должен выглядеть следующим образом:
    plugins {
      id 'java'
      id 'application'
    }
    
  3. Укажите путь к главному файлу приложения, добавив секцию настроек плагина. По умолчанию стартовым файлом приложения является org.example.Main. Если вы изменили название сгенерированного файла, то используйте имя вашего файла.
    application {
      mainClass = 'org.example.Main'
    }
    
  4. Синхронизируйте конфигурацию Gradle и IDEA. Для этого либо:
    • Нажмите на кнопку с изображением слона и вращающимися стрелками, которая появилась в правой-верхней части редактора.
    • Откройте конфигурацию системы сборки Gradle (слоник в правой части экрана). В появившемся окне нажмите на кнопку с вращающимися стрелками. Панель настроек Gradle можно закрыть.

Если настройка была выполнена верно, то приложение можно запустить:

  1. Дважды нажмите клавишу Ctrl.
  2. В появившемся окне наберите gradle run. В интерактивной форме среди всех возможных действий будет найдена задача run системы сборки Gradle. Данная задача отвечает за запуск приложения.
  3. Нажмите на клавишу Enter, чтобы запустить приложение.
  4. Убедитесь, что был запущен код, размещённый внутри класса org.example.Main.

В будущем после двойного нажатия на Ctrl будут отображаться успешно запущенные команды, их будет легко выбрать из данного списка с помощью клавиш вверх и вниз.

В рамках курса среда разработки IDEA используется как хороший редактор с глубокими подсказками по коду. При проверке ваших работ будет использоваться исключительно система сборки Gradle.

Задание № 1. Формирование JSON-документов вручную #

Сформируйте JSON-документ, который будет содержать список как минимум из пяти треугольников. У каждого треугольника должны быть описаны длины сторон и цвет стороны. Рекомендации:

  • Данный документ рекомендуется располагаться в корне проекта.
  • Данный документ можно назвать triangles-data.json.
  • Корневым элементом рекомендуется выбрать массив, содержащий объекты с описанием треугольников.
  • Длины сторон треугольника лучше описать с помощью чисел.
  • Цвет сторон треугольника описывается строкой.
  • В качестве названий свойств объектов, описывающих треугольники, рекомендуется использовать sideA, sideB, sideC, color.

После создания JSON-документа проверьте его на корректность с помощью сайта https://jsonlint.com/.

Задание № 2. Чтение JSON-документов в программе #

В рамках данного задания необходимо разработать приложение, которое будет считывать информацию из файла, сделанного в предыдущем задании. После считывания информации приложение должно вывести на стандартный поток вывода информацию по треугольникам. Для преобразования текстовых данных из файла в объекты языка Java воспользуйтесь библиотекой Jackson.

Шаг № 1. Добавление библиотеки в проект #

Для использования библиотеки в исходном коде приложения, её необходимо добавить в систему сборки. Нам потребуется добавить в приложение следующие библиотеки:

При добавлении библиотек необходимо использовать одинаковые версии. На настоящий момент последняя версия библиотеки — 2.16.1.

Для добавления зависимостей в Gradle необходимо внести изменения в файл build.gradle. В раздел dependecnies необходимо добавить новую строчку:

implementation 'com.fasterxml.jackson.core:jackson-databind:2.16.1'

После изменения файла build.gradle необходимо синхронизировать конфигурацию Gradle и IDEA.

Шаг № 2. Считывание данных из файла #

Для работы библиотеки Jackson необходимо описать класс, в объекты которого будут помещены данные, описывающие треугольник в JSON-документе.

  • Класс рекомендуется назвать org.example.Triangle.
  • У класса нужно определить 3 вещественных свойства: sideA, sideB, sideC. А также одно строковое свойство color.

Затем необходимо:

  • Создать объект com.fasterxml.jackson.databind.ObjectMapper с настройками по умолчанию.
  • Создать объект java.io.File, передав ему в качестве аргумента путь к файлу triangles-data.json (можно использовать относительный путь, т.к. Gradle всегда использует в качестве рабочего каталога корень проекта).
  • Воспользуйтесь методом readValue в качестве типа данных укажите массив из объектов Triangle: Triangle[].class. Результат работы поместите в массив из объектов Triangle.
  • Выведите на стандартный поток вывода список считанных треугольников в формате, удобном для восприятия обычным человеком.

Задание № 3. Запись JSON-документов в программе #

В рамках данного задания необходимо создать список из 100 случайных треугольников. Каждый созданный треугольник должен:

  • Иметь уникальные значения сторон.
  • Периметр треугольника должен быть в промежутке от 50 до 100.

Созданные треугольники должны быть записаны в файл generated-data.json в формате, совпадающим с форматом файла triangles-data.json.

Далее указан один из подходов к решению данной задачи.

  • В классе org.example.Triangle определите статический метод createRandom, который будет принимать в качестве аргумента максимальную длину стороны треугольника, и который будет возвращать объект типа Triangle.
    • Для получения значений случайного значения используйте метод nextDouble класса RandomGenerator.
  • В классе org.example.Triangle определите метод perimetr, который будет возвращать значение периметра треугольника.
  • В классе org.example.Triangle реализуйте интерфейс Comparable для сравнения с другим треугольником. Два треугольника будут считаться одинаковыми, если их стороны отличаются не более чем на одну тысячную.
  • В классе org.example.Main определите статический метод createTriangles, внутри которого реализуйте создание необходимого количества треугольников согласно заданию. Данный метод должен возвращать список (java.util.List) из объектов треугольников.
  • В статическом методе main класса org.example.Main вызовите метод createTriangles и воспользуйтесь методом writeValue класса ObjectMapper для записи созданного списка треугольников в файл.

Задание № 4. Чтение данных без использования библиотек #

В рамках данного задания предлагается реализовать чтение и данных из JSON-строк самостоятельно, без использования объекта ObjectMapper.

Для чтения потребуется реализовать метод, принимающий в качестве аргумента строку (тело JSON-документа) и возвращающий в качестве ответа список из треугольников. Учтите, что входящая строка не обязательно содержит корректные данные.

Для записи потребуется реализовать метод, принимающий в качестве аргумента список из треугольников и возвращающий в качестве ответа строку, содержащую JSON-документ.

© A. M. Васильев, 2024, CC BY-SA 4.0, andrey@crafted.su