Работа со структурированными данными #
Во время работы веб-приложению зачастую необходимо выполнять обмен данными с жёстким диском и другими системами:
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-документ.
Документация #
- Что такое JSON
- Описание JSON на MDN
- Что такое JSON — введение
- Парсинг JSON с помощью Jackson
- Jackson Databind project page
- Jackson JSON Tutorial
Подготовка. Создание проекта #
При создании проекта в IDEA будем использовать систему сборки Gradle. Для этого запустите мастер по созданию нового проекта и выберите следующие пункты:
- Укажите название проекта и его местоположение.
- Выберите язык программирования (Language): Java
- Выберите систему сборки (Build system): Gradle
- Выберите язык описания системы сборки (Gradle DSL): Groovy
- Оставьте настройку по добавлению автоматически созданного кода (Add sample code).
Дождитесь окончания операций по импорту проекта.
Завершите настройку проекта.
- Откройте файл конфигурации Gradle:
build.gradle
в корне проекта. - Добавьте плагин
application
в список плагинов проекта. После добавления список плагинов должен выглядеть следующим образом:plugins { id 'java' id 'application' }
- Укажите путь к главному файлу приложения, добавив секцию настроек плагина. По умолчанию стартовым файлом приложения является
org.example.Main
. Если вы изменили название сгенерированного файла, то используйте имя вашего файла.application { mainClass = 'org.example.Main' }
- Синхронизируйте конфигурацию Gradle и IDEA. Для этого либо:
- Нажмите на кнопку с изображением слона и вращающимися стрелками, которая появилась в правой-верхней части редактора.
- Откройте конфигурацию системы сборки Gradle (слоник в правой части экрана). В появившемся окне нажмите на кнопку с вращающимися стрелками. Панель настроек Gradle можно закрыть.
Если настройка была выполнена верно, то приложение можно запустить:
- Дважды нажмите клавишу
Ctrl
. - В появившемся окне наберите
gradle run
. В интерактивной форме среди всех возможных действий будет найдена задачаrun
системы сборки Gradle. Данная задача отвечает за запуск приложения. - Нажмите на клавишу
Enter
, чтобы запустить приложение. - Убедитесь, что был запущен код, размещённый внутри класса
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. Добавление библиотеки в проект #
Для использования библиотеки в исходном коде приложения, её необходимо добавить в систему сборки. Нам потребуется добавить в приложение следующие библиотеки:
- Jackson Databind и автоматически зависимые от неё
При добавлении библиотек необходимо использовать одинаковые версии. На настоящий момент последняя версия библиотеки — 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-документ.