Шпаргалка Java программиста 8. Библиотеки для работы с Json (Gson, Fastjson, LoganSquare, Jackson, JsonPath и другие)
Информационный портал по безопасности
Информационный портал по безопасности » Программирование » Шпаргалка Java программиста 8. Библиотеки для работы с Json (Gson, Fastjson, LoganSquare, Jackson, JsonPath и другие)
Шпаргалка Java программиста 8. Библиотеки для работы с Json (Gson, Fastjson, LoganSquare, Jackson, JsonPath и другие)
Автор: admin от 26-04-2016, 17:17, посмотрело: 1 059
В одной из моих прошлых статей я рассказывал о своем opensorce pet проекте useful-java-links, идея которого собрать как можно больше ссылок на полезные Java библиотеки и фреймворки. У него так же есть подпроект Hello World project идея которого для каждой библиотеки собрать несколько простых примеров её использования.
Проблема программистов в Java мире в том что кроме стандартной библиотеки JDK есть огромное других полезных библиотек, причем переход от одной библиотеки к другой может вызывать проблемы из-за неполной документации, отсутствия простых примеров или даже сложности понять какие зависимости нужно добавить в maven чтобы все запустилось. А на новой работе вполне могут использовать вместо твоей любимой библиотеки ту которую ты не знаешь. Идея моего проекта облегчить изучение и выбор разных библиотек.
Итак, давайте посмотрим какие известные библиотеки есть для работы с JSON в Java…
8. Работа с Json
JSON парсеры
Аналог XPath для JSON
Генерация Java классов из JSON или JSON схемы и JSON валидация
Итак, у нас восемь библиотек для сериализации и десериализации в json, две библиотеки для генерации Java классов по схеме или json файлу, одна библиотека для валидации схемы и два аналога XPath, но для json. Давайте рассмотрим каждую из них.
1. JSON парсеры
Существует три основных способа сериализации и десериализации среди указанных библиотек (от самого простого к самому сложному) и один дополнительный:
Давайте рассмотрим с чем их едят:
Data bind самый популярный и простой способ, вы просто указываете класс, который нужно преобразовать в json, может быть часть полей отмечаете аннотациями (а зачастую даже это необязательно), а библиотека сама превращает этот класс и всю его иерархию классов в json. Аналогом при работе с xml будет JAXB (Java Architecture for XML Binding)
[b]Плюсы[/b]: наиболее простой из всех, по сути главное реализовать только Java классы, более того можно просто сгенерировать Java классы из json’a или json схемы.
[b]Минусы[/b]: скорость и память. Большинство библиотек использует рефлексию и т.п. методы работы с Java классами (хотя не все), что очевидно не очень быстро. К тому же, весь json файл сразу превращается в Java объекты, что может просто исчерпать всю доступную память, если вы попытаетесь обработать очень большой json.
[b]Вывод[/b]: если нет проблем с производительностью, памятью и вы не собираетесь обрабатывать многогигабайтные json’ы скорее всего самый лучший способ.
Tree Model — данный парсер представляет json в виде Java классов таких как Node или JsonElement c иерархической структурой, а уже сам программист их обходит и получает из них информацию. Данный способ похож на DOM парсеры в xml.
[b]Плюсы[/b]: обычно быстрее первого способа и проще третьего,
[b]Минусы[/b]: уступает Data bind по простоте, плюс ряд библиотек способен генерить классы при Data bind, а не использовать рефлексию, в этом случае то что Tree Model будет быстрее не очевидно, к тому же не решается проблема огромных файлов и ограничения памяти.
Streaming API — самый низкоуровневый способ, по сути программист сам вручную разбирает токены json’a. Зато никаких ограничений по памяти и в теории максимальная производительность.
[b]Плюсы[/b]: производительность и минимальное потребление памяти,
[b]Минусы[/b]: сложность использования,
Обзор Gson – работаем с JSON в Java
JSON, что означает JavaScript Object Notation, – это текстовый формат обмена данными, который легко читается человеком и в то же время является компактным (в отличии от того же XML формата).
JSON произошел от javascript и очень часто используется в веб-программировании при обмене данными между веб-браузером и сервером. В самом javascript каждый валидный json объект может быть легко десериализован с помощью встроенной функции eval().
Вообще, о самом формате JSON в Интернете написано более чем достаточно, ну а в этой статье я хочу рассмотреть бибилиотеку Gson для сериализации и десериализации java объектов в JSON. Полный код примеров из статьи, оформленных в виде тест кейсов, можно найти на GitHub по этой ссылке – GsonTest.java.
А вот что нас сегодня ожидает:
Обзор библиотеки Gson
Gson – это небольшая java библиотека, которая позволяет конвертировать java объекты в их JSON представление, равно как и создавать объекты на основании их json представления.
Изначально Gson был разработан в Google и использовался в нескольких внтуренних проектах. Через некоторое время было принято решение отдать библиотеку в open-source, чтобы она и дальше развивалась.
Основным классом библиотеки есть одноименный класс Gson. Для того, чтобы создать экземпляр класса нужно воспользоваться одним из двух способов:
- Gson gson = new Gson();
- Gson gson = new GsonBuilder().create();
Первый способ создаст инстанс класса с настройками по умолчанию, а второй способ позволит применить некоторые настройки. О настройках расскажу чуть ниже.
Основные методы, которые используются для сериализации и десериализации java-объектов, называются toJson и fromJson.
Сериализация и десериализация в Gson
Начнем с чего-нибудь попроще:
Это так называемы примитивы JSON. А вот так их можно десериализовать:
Так как инстанс Gson не имеет внутреннего состояния, то его можно переиспользовать произвольное количество раз, а так же использовать в многопоточных приложениях.
Идем дальше. Вот таким образом можно сериализовать и десеарелизовать массив:
С объектами, которые в качестве полей содержат строки и примитивы, все тоже достаточно просто. Допустим, у нас в приложении описан следующий класс:
И экземпляр класса созданный таким способом:
Смотрим, что получается:
Обратите внимание, что при сериализации значение поля random не было сохранено. Все дело в том, что поведение библиотеки по-умолчанию не сериализует поля, помеченные модификатором transient. О том, как изменить это поведение, читайте в разделе про GsonBuilder.
Работа с коллекциями
Сериализация коллекций, таких как ArrayList, LinkedList, HashSet, TreeMap и других, реализована таким образом:
- метод toJson для Collection вернет массив объектов или примитивов;
- метод toJson для Map вернет ассоциативный массив.
С десериализацией все немного сложнее. Рассмотрим следующий пример:
Обратите внимание как мы определили тип для коллекции при десериализации. К сожалению, сделать это как-то проще не получится, c’est la vie.
Допустим, вам необходимо конвертировать коллекцию, содержащую объекты различных типов. В этом случае с сериализацией проблем не возникнет, например:
А вот десереализовать такую коллекцию не получится, так как Gson не сможет найти правильные соответствия для типов данных.
Одним из самых хороших решений этой проблемы будет использование низкоуровневого API – классы JsonElement, JsonPrimitive, JsonObject и так далее. Некоторое представление о том, как это сделать, вы сможете получить в следующем разделе статьи.
Определяем свои правила конвертации объектов
Gson позволяет разработчикам определять свои собственные правила для сериализации и десериализации объектов. Зарегистрировать их можно с помощью метода registerTypeAdapter().
Допустим, у нас в приложении есть следующий класс:
Для кастомного сериализатора необходимо реализовать интерфейс JsonSerializer, а для десериализаторв – соответственно JsonDeserializer. Для простоты можно создать один класс, который реализует оба эти интерфейса:
Зарегистрировать наш класс можно следующим образом:
Настройки Gson и класс GsonBuilder
В этом разделе я бы хотел мельком рассмотреть несколько настроек класса GsonBuilder.
По умолчанию результат сериализации в json будет компактным, то есть все лишние whitespace символы будут удалены. Это позволит, например, уменьшить траффик при передачи JSON объектов по сети.
Метод setPrettyPrinting у класса GsonBuilder меняет это поведение и сериализует объекты в удобную для человека форму с пробелами и переводами строк. Пример вы можете посмотреть по ссылке приведенной в начале статьи.
Еще одна полезная настройка для GsonBuilder – excludeFieldsWithModifiers. Она позволяет изменить набор несериализуемых полей при конвертации java объектов в JSON. По умолчанию игнорируются только поля с модификатором transient.
Ну вот наверное и все. Вопросы и комментарии приветствуются.
Java JSON
J SON (JavaScript Object Notation) — простой для использования формат обмена данными. JSONиспользуется в огромном числе проектов, существует множество реализаций для различных платформ. Для тех, кому по какой-то причине не нравится XML, JSON является отличной альтернативой.
В этом руководстве мы рассмотрим три распространенные Java библиотеки, позволяющих работать с JSON данными: Jackson, Google Gson и JSON.simple.
Jackson
Высокопроизводительный процессор JSON данных.
- Пример использования Jackson: Java объекты и JSON
Пример использования объекта ObjectMapper , его методов readValue() и writeValue() для преобразования Java объектов в JSON и обратно. - Пример использования Jackson: Map и JSON
Преобразования объектов типа Map (ассоциативные массивы) в JSON и обратно. - Пример Jackson Tree Model
Преобразование JSON данных в древовидные объекты. - Jackson: пример потоковой обработки
Пример использования объектов типа JsonGenerator и JsonParser для потокового чтения и записи JSON данных. - Jackson: красивое форматирование
Пример использования метода writerWithDefaultPrettyPrinter() для получения красиво отформатированных JSON данных.
Google Gson
Библиотека, которая изначально была разработана для внутреннего использования в компании Google, а теперь является общедоступным проектом.
- Модель данных Gson: Java объекты и JSON
Пример использования методов toJson() и fromJson() для преобразования Java объектов в JSON и обратно. - Пример потоковой обработки данных в Gson
Пример использования объектов JsonWriter и JsonReader для потоковой обработки JSON данных. - Красивое форматирование в Gson
Пример красивого форматирования JSON данных.
JSON.simple
Простая Java библиотека для чтения и записи JSON данных.
- JSON.simple для чтения и записи JSON данных
В данном примере показано, как читать из файла и записывать в файл JSON данные.
Полезная информация
Пример использования Jackson: Map и JSON
В этой статье показан пример использования библиотеки Jackson для преобразования JSON-строки в Java объект типа Map и обратно. Мы рассмотрим 4 примера работы с JSON: Преобразование строки JSON в объект типа Map Преобразование объекта типа Map в JSON строку Преобразование объекта типа Map в JSON файл Преобразование JSON файла в объект типа Map Преобразование строки JSON в объект типа Map .
JSON.simple для чтения и записи JSON данных
JSON.simple — простая Java библиотека для работы с данными в формате JSON, полностью совместимая со спецификацией RFC4627 — The application/json Media Type for JavaScript Object Notation (JSON). При работе с библиотекой JSON.simple применяются собственные объекты для представления данных. Если Вам требуется переводить в JSON объекты своих типов данных или восстанавливать состояние объектов своих типов данных из JSON представления, то следует .
Красивое форматирование в Gson
В этой статье мы рассмотрим способ «человеческого» оформления JSON при использовании библиотеки Google Gson. В качестве основы возьмем пример с моделью данных и преобразования Java объектов в JSON. Если применять стандартный подход к формированию JSON данных: Gson gson = new Gson(); String json = gson.toJson(map); System.out.println(json); То результат будет следующий: <"site":"https://j4web.ru","age":2,"name":"j4web","messages":["Message 1","Message 2","Message 3"]>Для того, чтобы JSON текст был .
Модель данных Gson: Java объекты и JSON
JSON (JavaScript Object Notation) — простой для использования формат обмена данными, который в последнее время используется все чаще и чаще, постепенно вытесняя из определенных ниш формат XML. При разработке приложений на Java очень часто возникают задачи, связанные с переводом некоторого Java объекта (с учетом всей его, возможно, сложной структуры) в строковое представление и обратно. В этой статье мы будем рассматривать .
Пример потоковой обработки данных в Gson
Начиная с версии 1.6 в библиотеку Gson были добавлены два новых класса — JsonReader и JsonWriter, предназначенные для потоковой обработки JSON данных. Получить полное представление о преимуществах использования потоковой обработки данных можно прочитав официальную документацию Google Gson. В данном руководстве будут рассмотрены примеры генерации и чтения данных в формате JSON. Предназначение каждого из этих классов становится понятным из их названий: .
Jackson: красивое форматирование
В данном руководстве мы рассмотрим возможности библиотеки Jackson в части «красивого» (удобного для восприятия) оформления JSON объектов при выводе их в строку и на консоль. Красивое оформление JSON объектов Рассмотрим способ преобразования JSON объекта в строковое представление: ObjectMapper mapper = new ObjectMapper(); try < Map map = mapper.readValue(new File(FILENAME), new TypeReference >()<>); System.out.println(mapper.writeValueAsString(map)); > catch (IOException .
Jackson: пример потоковой обработки
Библиотека Jackson позволяет читать и записывать данные в формате JSON с помощью высокопроизводительного API потоковой обработки Jackson. Документацию можно найти на официальном сайте проекта. Там же описаны и все преимущества работы с потоковой обработкой. API потоковой обработки Jackson является высокопроизводительным, быстрым и удобным способом работы с данными в формате JSON, но в то же время он довольно сложен, потому что .
Пример Jackson Tree Model
Применяя библиотеку Jackson можно использовать так называемую технологию Tree Model (Древовидная модель) для представления данных в формате JSON, а также для выполнения чтения и изменения данных. Эти Операции выполняются посредством объекта типа TreeNode, по аналогии с технологией DOM для работы с данными в формате XML. Простой пример исходного кода показывает принцип работы с объектами типа TreeNode: // Создаем объект ObjectMapper .