Как прочитать json файл java gson

Обновлено: 04.07.2024

По сути это набор пар “ключ-значение”, объединенных в последовательность значений(массив). Допустим мы производим выборку информацию о заказчике из БД и возвращаем сведения о нем. Пример строки в формате JSON будет выглядеть так:

Вообще, о самом формате JSON в Интернете написано более чем достаточно, ну а в этой статье я хочу рассмотреть бибилиотеку Gson для сериализации и десериализации java объектов в JSON.

1 Обзор библиотеки Gson

Изначально Gson был разработан в Google и использовался в нескольких внтуренних проектах. Через некоторое время было принято решение отдать библиотеку в open-source, чтобы она и дальше развивалась.

1.1 Подключение GSON

Сначала подключим библиотеку. Если вы используете в качестве сборщика Gradle, добавьте новую зависимость:

Вот, что нужно прописать в файл pom.xml тем, кто использует Maven:

1.2 Использование GSON

Основным классом библиотеки есть одноименный класс Gson. Для того, чтобы создать экземпляр класса нужно воспользоваться одним из двух способов:

Первый способ создаст инстанс класса с настройками по умолчанию, а второй способ позволит применить некоторые настройки. О настройках расскажу чуть ниже.

Основные методы, которые используются для сериализации и десериализации java-объектов, называются toJson и fromJson .

2 Сериализация и десериализация в Gson

Начнем с чего-нибудь попроще:

Это так называемы примитивы JSON. А вот так их можно десериализовать:

Так как инстанс Gson не имеет внутреннего состояния, то его можно переиспользовать произвольное количество раз, а так же использовать в многопоточных приложениях.

Идем дальше. Вот таким образом можно сериализовать и десеарелизовать массив:

С объектами, которые в качестве полей содержат строки и примитивы, все тоже достаточно просто. Допустим, у нас в приложении описан следующий класс:

И экземпляр класса созданный таким способом:

Смотрим, что получается:

Обратите внимание, что при сериализации значение поля random не было сохранено. Все дело в том, что поведение библиотеки по-умолчанию не сериализует поля, помеченные модификатором transient . О том, как изменить это поведение, читайте в разделе про GsonBuilder .

3 Работа с коллекциями

Сериализация коллекций, таких как ArrayList, LinkedList, HashSet, TreeMap и других, реализована таким образом:

  • метод toJson для Collection вернет массив объектов или примитивов;
  • метод toJson для Map вернет ассоциативный массив.

С десериализацией все немного сложнее. Рассмотрим следующий пример:

Обратите внимание как мы определили тип для коллекции при десериализации. К сожалению, сделать это как-то проще не получится.

Допустим, вам необходимо конвертировать коллекцию, содержащую объекты различных типов. В этом случае с сериализацией проблем не возникнет, например:

А вот десереализовать такую коллекцию не получится, так как Gson не сможет найти правильные соответствия для типов данных.

4 Определяем свои правила конвертации объектов

Gson позволяет разработчикам определять свои собственные правила для сериализации и десериализации объектов. Зарегистрировать их можно с помощью метода registerTypeAdapter() .

Допустим, у нас в приложении есть следующий класс:

Зарегистрировать наш класс можно следующим образом:

5 Настройки Gson и класс GsonBuilder

По умолчанию результат сериализации в json будет компактным, то есть все лишние whitespace символы будут удалены. Это позволит, например, уменьшить траффик при передачи JSON объектов по сети.

Метод setPrettyPrinting у класса GsonBuilder меняет это поведение и сериализует объекты в удобную для человека форму с пробелами и переводами строк. Пример вы можете посмотреть по ссылке приведенной в начале статьи.

6 Пример использования GSON

Нам надо преобразовать данные JSON в Java-объект. Пусть у нас имеется класс Student , представляющий заказчика, с определенными полями: имя и курс.

Аннотация @SerializedName используется для изменения выходного имени свойства при сериализации, если это потребуется.

Итак, мы получили объект в виде строки, например такой объект может прийти приложению-клюиенту от сервера или может быть считан с файла. Для выполнения парсинга нам необходимо получить объект класса Gson , для этого удобно использовать GsonBuilder . Преобразование JSON в объект класса Student выполняется методом Gson.from() :

Здесь методу fromJson() мы в качестве второго параметра должны передаем тип нашей коллекции.

image

В одной из моих прошлых статей я рассказывал о своем opensorce pet проекте useful-java-links, идея которого собрать как можно больше ссылок на полезные Java библиотеки и фреймворки. У него так же есть подпроект Hello World project идея которого для каждой библиотеки собрать несколько простых примеров её использования.

Проблема программистов в Java мире в том что кроме стандартной библиотеки JDK есть огромное других полезных библиотек, причем переход от одной библиотеки к другой может вызывать проблемы из-за неполной документации, отсутствия простых примеров или даже сложности понять какие зависимости нужно добавить в maven чтобы все запустилось. А на новой работе вполне могут использовать вместо твоей любимой библиотеки ту которую ты не знаешь. Идея моего проекта облегчить изучение и выбор разных библиотек.

Итак, давайте посмотрим какие известные библиотеки есть для работы с JSON в Java…

8. Работа с Json

JSON парсеры
    Быстрый JSON обработчик, рейтинг github'а — 4851. User guide и Hello World examples. Лицензия: Apache 2. — Простая сериализации объектов в JSON и обратно. Хорошая производительность и легкость в использовании, рейтинг github'а — 4120. User guide и Hello World examples. Лицензия: Apache 2. -Библиотека парсинга и сериализации JSON, основанная на Jackson's streaming API. По словам разработчиков, превосходит по производительности GSON и Jackson библиотеки, рейтинг github'а — 2188. User guide и Hello World examples. Лицензия: Apache 2. Реализация работы с JSON в Java от разработчиков JSON стандарта, рейтинг github'а — 1937. User guide и Hello World examples. Лицензия: Crockford's license (MIT License + "Good, not Evil"). JSON библиотека для Android и Java, служит для упрощения парсинга Json в объекты Java, рейтинг github'а — 1732. User guide и Hello World examples. Лицензия: Apache 2 Быстрый JSON парсер для java проектов, рейтинг github'а — 921. User guide и Hello World examples. Лицензия: BSD 3. — Похоже на GSON, но более производительна, если вам нужно часто создавать экземпляр библиотеки. Подпроекты: Jackson core Базовая часть функционала, Jackson databind Базовая реализация databind'а, рейтинг github'а — 881. User guide и Hello World examples. Лицензия: Apache 2. — Мощная и простая в использовании Java библиотека для преобразования в/из JSON, рейтинг github'а — 108. User guide и Hello World examples. Лицензия: Apache 2.
Аналог XPath для JSON
Генерация Java классов из JSON или JSON схемы и JSON валидация
    Генерация Java классов из JSON схемы (или примера JSON) с аннотациями для data-binding для Jackson 1.x or 2.x, Gson и т. п. рейтинг github'а — 1664. User guide и Hello World examples. Лицензия: Apache 2. Валидация JSON схемы, реализована на чистой Java, создана с целью проверки Json файлов, используя Json схемы., так же может генерировать Java классы из схемы и наоборот, рейтинг github'а — 547. User guide и Hello World examples. Лицензия: GNU Lesser 3/Apache 2.

Итак, у нас восемь библиотек для сериализации и десериализации в json, две библиотеки для генерации Java классов по схеме или json файлу, одна библиотека для валидации схемы и два аналога XPath, но для json. Давайте рассмотрим каждую из них.

1. JSON парсеры

Существует три основных способа сериализации и десериализации среди указанных библиотек (от самого простого к самому сложному) и один дополнительный:

  1. Data bind,
  2. Tree Model,
  3. Streaming API,
  4. (И дополнительный способ) Аналоги XPath,

Давайте рассмотрим с чем их едят:

Data bind самый популярный и простой способ, вы просто указываете класс, который нужно преобразовать в json, может быть часть полей отмечаете аннотациями (а зачастую даже это необязательно), а библиотека сама превращает этот класс и всю его иерархию классов в json. Аналогом при работе с xml будет JAXB (Java Architecture for XML Binding)
Плюсы: наиболее простой из всех, по сути главное реализовать только Java классы, более того можно просто сгенерировать Java классы из json'a или json схемы.
Минусы: скорость и память. Большинство библиотек использует рефлексию и т.п. методы работы с Java классами (хотя не все), что очевидно не очень быстро. К тому же, весь json файл сразу превращается в Java объекты, что может просто исчерпать всю доступную память, если вы попытаетесь обработать очень большой json.
Вывод: если нет проблем с производительностью, памятью и вы не собираетесь обрабатывать многогигабайтные json'ы скорее всего самый лучший способ.

Tree Model — данный парсер представляет json в виде Java классов таких как Node или JsonElement c иерархической структурой, а уже сам программист их обходит и получает из них информацию. Данный способ похож на DOM парсеры в xml.
Плюсы: обычно быстрее первого способа и проще третьего,
Минусы: уступает Data bind по простоте, плюс ряд библиотек способен генерить классы при Data bind, а не использовать рефлексию, в этом случае то что Tree Model будет быстрее не очевидно, к тому же не решается проблема огромных файлов и ограничения памяти.

Streaming API — самый низкоуровневый способ, по сути программист сам вручную разбирает токены json'a. Зато никаких ограничений по памяти и в теории максимальная производительность.
Плюсы: производительность и минимальное потребление памяти,
Минусы: сложность использования,

Аналоги XPath — дополнительный способ, не очень подходит, если нужно получит всю информацию из json'a, зато позволяет написав выражение $.store.book[*].author и получить список всех авторов всех книг из json'a магазина. То есть легко получать часть информации из json'а.
Плюсы: позволяет быстро получить информацию из json'а по сложным критериям,
Минусы: не очень подходит, когда нужна все информация из json'а, не работает в обратную сторону на формирования json'ов,

1.1 Обзор библиотек

Способ Fastjson Gson LoganSquare JSON java Moshi Ig json parser Jackson Genson JsonPath
1. Data bind Да Да Да - Да Да Да Да -
2. Tree Model - Да - Да - - Да - -
3. Streaming API - Да - - - - Да - -
4. Аналоги XPath Да - - - - - - - Да
5. Генерация классов для Data bind* - - Да - - Да - - -
6. Github's star 4851 4120 2188 1937 1732 921 881 108 849
7. Работает со static inner class** Да Да Нет - Да Нет Да Да -
8. Обязательность аннотаций*** Нет Нет Да - Нет Да Нет Нет -

По ссылкам на Да можно найти примеры использования.
* — Генерация классов для Data bind позволяет сгенерировать классы на стадии компиляции, что в теории должно давать значительный прирост производительности библиотеки,
** — Работает со static inner class имеет смысл только для случая Data bind, возможно ли сериализация и десериализация для случая статических внутренних классов (не статические внутренние классы сериализовать не рекомендуется),
*** — тоже только для случая Data bind можно ли не использовать аннотации или их использование крайне рекомендуется,

1.2 Простейшие примеры использование Data bind

Для демонстрации работы библиотек будем использовать следующий json:

И следующие Java классы (в разных примерах могут слегка отличаться наличием аннотаций, если они обязательны):

Примеры использования (Data bind):
Способ
Fastjson Gson LoganSquare Moshi Ig json parser Jackson Genson
Инициализация --- Gson gson = new Gson() --- Moshi moshi = new Moshi.
Builder().build(); JsonAdapter<Human>
jsonAdapter = moshi.adapter(Human.class)
--- ObjectMapper mapper = new ObjectMapper() Genson genson = new Genson()
Из Java в json JSON.toJSONString(human) gson.toJson(human) LoganSquare.serialize(human) jsonAdapter.toJson(human) Human__JsonHelper.serializeToJson(human) mapper.writeValueAsString(human) genson.serialize(human)
Из json в Java JSON.parseObject(jsonString, Human.class) gson.fromJson(jsonString, Human.class) LoganSquare.parse(jsonString, Human.class) jsonAdapter.fromJson(jsonString) Human__JsonHelper.parseFromJson(jsonString) mapper.readValue(jsonString, Human.class) genson.deserialize(jsonString, Human.class)

Human__JsonHelper — это класс который Ig json parser сгенерировал на этапе компиляции, у LoganSquare так же есть генерации на этапе компиляции, но там классы подключаются "под капотом" внутри LoganSquare.

Особенности Gson

Три способа обработки JSON

Gson предлагает три альтернативных способа обработки JSON:

Потоковый API

Он читает и записывает содержимое JSON как отдельные события. JsonReader и JsonWriter считывают / записывают данные как токен, называемый JsonToken .

Это самый мощный подход из трех подходов к обработке JSON. Он имеет минимальные накладные расходы и довольно быстр в операциях чтения / записи. Это аналог парсера Stax для XML.

Модель дерева

Он подготавливает представление дерева JSON в памяти. Он строит дерево узлов JsonObject. Это гибкий подход, аналогичный анализатору DOM для XML.

Привязка данных

Он преобразует JSON в POJO (простой старый объект Java) и обратно, используя метод доступа к свойствам. Gson читает / пишет JSON, используя адаптеры типов данных. Это аналог анализатора JAXB для XML.

Настройка локальной среды

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

Следуйте инструкциям для загрузки Java и запуска .exe для установки Java на вашем компьютере. После того, как вы установили Java на свой компьютер, вам нужно будет установить переменные среды, чтобы они указывали на их правильные каталоги установки.

Настройка пути в Windows 2000 / XP

Щелкните правой кнопкой мыши «Мой компьютер» и выберите «Свойства».

Затем измените переменную Path, чтобы она также содержала путь к исполняемому файлу Java. Например, если в настоящий момент путь задан как «C: \ WINDOWS \ SYSTEM32», измените ваш путь на «C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin».

Щелкните правой кнопкой мыши «Мой компьютер» и выберите «Свойства».

Затем измените переменную Path, чтобы она также содержала путь к исполняемому файлу Java. Например, если в настоящий момент путь задан как «C: \ WINDOWS \ SYSTEM32», измените ваш путь на «C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin».

Настройка пути в Windows 95/98 / ME

Отредактируйте файл «C: \ autoexec.bat» и добавьте в конце следующую строку: «SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin»

Отредактируйте файл «C: \ autoexec.bat» и добавьте в конце следующую строку: «SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin»

Настройка пути для Linux, UNIX, Solaris, FreeBSD

Переменная среды PATH должна быть указана в том месте, где были установлены двоичные файлы Java. Обратитесь к документации по вашей оболочке, если у вас возникли проблемы с этим.

Популярные редакторы Java

Загрузите последнюю версию файла Gson jar с gson-2.3.1.jar . На момент написания этого руководства мы загрузили gson-2.3.1.jar и скопировали его в папку C: \> gson.

Операционные системы Название архива
Windows gson-2.3.1.jar
Linux gson-2.3.1.jar
макинтош gson-2.3.1.jar

Установить среду Gson

Установите переменную окружения GSON_HOME, чтобы она указывала на местоположение базовой директории, где находится Gson jar на вашем компьютере.

Операционные системы Выход
Windows Установите переменную окружения GSON_HOME в C: \ gson
Linux экспортировать GSON_HOME = / usr / local / gson
макинтош экспорт GSON_HOME = / библиотека / gson

Установить переменную CLASSPATH

Задайте переменную среды CLASSPATH, чтобы она указывала на расположение Gson jar.

Операционные системы Выход
Windows Установите для переменной среды CLASSPATH значение% CLASSPATH%;% GSON_HOME% \ gson-2.3.1.jar;.;
Linux export CLASSPATH = $ CLASSPATH: $ GSON_HOME / gson-2.3.1.jar :.
макинтош export CLASSPATH = $ CLASSPATH: $ GSON_HOME / gson-2.3.1.jar :.

Прежде чем углубляться в детали библиотеки Google Gson, давайте посмотрим на приложение в действии. В этом примере мы создали класс Student . Мы создадим строку JSON с данными ученика и десериализовали бы ее в объект ученика, а затем сериализовали в строку JSON.

пример

Создайте файл класса Java с именем GsonTester в C: \> GSON_WORKSPACE.

Проверьте результат

Скомпилируйте классы, используя компилятор javac следующим образом:

Шаги, чтобы Помнить

Ниже приведены важные шаги, которые следует рассмотреть здесь.

Создайте объект Gson. Это повторно используемый объект.

Используйте метод fromJson (), чтобы получить Объект из JSON. Передать строку Json / источник строки Json и тип объекта в качестве параметра.

Используйте метод toJson (), чтобы получить строковое представление объекта в формате JSON.

Декларация класса

Конструкторы

Создает объект Gson с конфигурацией по умолчанию.

Создает объект Gson с конфигурацией по умолчанию.

Методы класса

<T> T fromJson (JsonElement json, Class <T> classOfT)

Этот метод десериализует чтение Json из указанного дерева разбора в объект указанного типа.

<T> T fromJson (JsonElement json, Тип typeOfT)

Этот метод десериализует чтение Json из указанного дерева разбора в объект указанного типа.

<T> T fromJson (читатель JsonReader, тип typeOfT)

Читает следующее значение JSON из читателя и преобразовывает его в объект типа typeOfT.

<T> T fromJson (Читатель JSON, Class <T> classOfT)

Этот метод десериализует чтение Json из указанного считывателя в объект указанного класса.

<T> T fromJson (Читатель json, Тип typeOfT)

Этот метод десериализует чтение Json из указанного считывателя в объект указанного типа.

<T> T fromJson (Строка json, Класс <T> classOfT)

Этот метод десериализует указанный Json в объект указанного класса.

<T> T fromJson (Строка json, Тип typeOfT)

Этот метод десериализует указанный Json в объект указанного типа.

<T> TypeAdapter <T> getAdapter (тип <T> класса)

Возвращает адаптер типа для типа.

<T> TypeAdapter <T> getAdapter (TypeToken <T> type)

Возвращает адаптер типа для типа.

<T> TypeAdapter <T> getDelegateAdapter (TypeAdapterFactory skipPast, TypeToken <T> type)

Этот метод используется для получения адаптера альтернативного типа для указанного типа.

String toJson (JsonElement jsonElement)

Преобразует дерево JsonElements в его эквивалентное представление JSON.

void toJson (JsonElement jsonElement, добавляемый писатель)

Записывает эквивалент JSON для дерева JsonElements.

void toJson (JsonElement jsonElement, автор JsonWriter)

Записывает JSON для jsonElement автору

String toJson (Object src)

Этот метод сериализует указанный объект в его эквивалентное представление Json.

void toJson (Object src, Writable Writer)

Этот метод сериализует указанный объект в его эквивалентное представление Json.

Строка toJson (объект src, тип typeOfSrc)

Этот метод сериализует указанный объект, включая объекты универсальных типов, в его эквивалентное представление Json.

void toJson (Object src, Тип typeOfSrc, Добавляемый писатель)

Этот метод сериализует указанный объект, включая объекты универсальных типов, в его эквивалентное представление Json.

void toJson (Object src, Тип typeOfSrc, Средство записи JsonWriter)

Записывает JSON-представление src типа typeOfSrc в Writer.

JsonElement toJsonTree (Object src)

Этот метод сериализует указанный объект в его эквивалентное представление в виде дерева JsonElements.

JsonElement toJsonTree (объект src, тип typeOfSrc)

Этот метод сериализует указанный объект, включая объекты универсальных типов, в его эквивалентное представление в виде дерева JsonElements.

Строка toString ()

<T> T fromJson (JsonElement json, Class <T> classOfT)

Этот метод десериализует чтение Json из указанного дерева разбора в объект указанного типа.

<T> T fromJson (JsonElement json, Тип typeOfT)

Этот метод десериализует чтение Json из указанного дерева разбора в объект указанного типа.

<T> T fromJson (читатель JsonReader, тип typeOfT)

Читает следующее значение JSON из читателя и преобразовывает его в объект типа typeOfT.

Я хотел бы проанализировать данные из JSON, который имеет тип String . Я использую Google Gson .

Это простой код для этого, я избежал всех проверок, но это основная идея.

Чтобы сделать использование более общим - вы обнаружите, что Javadocs Гсона довольно понятны и полезны.

в первой строке не может быть создан экземпляр типа JsonParser в версии gson-2.2.4.jar String result = jobject.get ("translationText"). ToString (); Этот результат будет включать двойные кавычки. String result = jobject.get ("translationText"). GetAsString (); не включает в себя кавычки. Я единственный, кто думает, что Гсон усложняет вещи в 98% случаев? Подойдет простой JSONObject, но мы все так ненавидим try / catch? Мне нужно использовать класс синтаксического анализатора, однако я получаю исключение MalformedJsonException, поэтому я должен иметь возможность выполнять SetLeinient с JsonParser. Как?

В моем первом приложении gson я избегал использования дополнительных классов для перехвата значений, потому что я использую json для настройки

несмотря на недостаток информации (даже страницы gson), я нашел и использовал ее:

Каждый раз, когда gson видит <>, он создает карту (на самом деле StringMap gson)

Каждый раз, когда gson видит '', он создает строку

Каждый раз, когда гсон видит число, он создает двойной

Каждый раз, когда gson видит [], он создает ArrayList

Вы можете использовать эти факты (в сочетании) в ваших интересах

Наконец, это код, который делает вещь

Обычно проще всего создать соответствующую иерархию объектов, например:

а затем связать с помощью GSON, пройти через иерархию объектов через поля. Добавлять геттеры и сеттеры бессмысленно для базовых контейнеров данных.

Так что-то вроде:

Тогда ваша объектная структура НЕ соответствует JSON.

Вы можете создать соответствующие классы Java для объектов JSON. Целочисленные, строковые значения могут отображаться как есть. Json может быть разобран так

Вы можете использовать отдельный класс для представления объекта JSON и использовать @SerializedName аннотации для указания имени поля, которое нужно получить для каждого элемента данных:

Затем вы можете выполнить синтаксический анализ в вашем методе parse (), используя Gson объект:

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

Одним из способов будет создание JsonObject и итерация по параметрам. Например

Затем вы можете извлечь значения bean-компонентов:

Надеюсь это поможет.

Используя Gson для решения,
я бы создал класс для отдельного параметра в строке json. В качестве альтернативы вы можете создать один основной класс с именем «Данные», а затем аналогичным образом создать внутренние классы. Я создал отдельные классы для ясности.

  • Данные
  • Переводы
  • TranslatedText

В классе JsonParsing мы вызываем метод "parse", gson.fromJson(jsonLine, Data.class) который преобразует String в java-объекты, используя Reflection.

Получив доступ к объекту «Данные», мы можем получить доступ к каждому параметру в отдельности.

У меня не было возможности протестировать этот код, так как я вдали от своей машины разработчика. Но это должно помочь.

Читайте также: