- Android Studio: получение JSON в ListView и ArrayAdapter. Урок № 2
- Смотрите видео: Android Studio: получение JSON в ListView и ArrayAdapter. Урок № 2
- Шпаргалка Java программиста 8. Библиотеки для работы с Json (Gson, Fastjson, LoganSquare, Jackson, JsonPath и другие)
- 8. Работа с Json
- 1. JSON парсеры
- 1.1 Обзор библиотек
- 1.2 Простейшие примеры использование Data bind
Android Studio: получение JSON в ListView и ArrayAdapter. Урок № 2
Всем привет, и сегодня мы продолжим рассматривать возможности работы с json файлами в Android Studio.
На этот раз будем использовать listView для отображения данных, хочу напомнить, что в прошлом видео мы работали с recyclerview и cardview , и сегодня будем делать макет попроще, будет иной принцип подключения файла json со списком.
Подобный пример можно использовать в качестве различных справочных андроид приложений, для курсовых и дипломных работ, храня данные в локальном файле, так что приятного просмотра, будет интересно.
Смотрите видео: Android Studio: получение JSON в ListView и ArrayAdapter. Урок № 2

Давайте создадим новый проект с пустой активностью, дадим названием, как вы помните в прошлый раз проект назывался Load Json from assets -01 , назовем также с цифрой два, Load Json from assets -02 .
Проект у нас загружен, и давайте создадим папку assets для json файла, создадим новый файл users.json, на этот раз вставим значение, но без имени массива users , сейчас поработаем с безымянном массивом, позже я покажу как работать с этим файлом, сохраним, закроем файл.
Откроем activity_main.xml , заменим виджет ConstraintLayout на RelativeLayout , а TextView изменения на ListView . Уберём отсюда всё лишнее и добавим Android:id ListView .
Список ListView будет для общего плана, а для пунктов списка создадим в папке layout ещё один Resource File, как и в прошлом примере назавем его row.xml . Заменим в разметке RelativeLayout , id не нужен, добавим отступы 6dp.
Внутри RelativeLayout добавим LinearLayout , ориентация – вертикальная, внутренний отступ – 5dp.
Так же добавим два TextView с id, name и email, соответственно, размер текста – 30sp.
Для RelativeLayout и LinearLayout установим ширину — match_parent , высоту — wrap_content , с разметкой закончили.
Переходим в MainActivity , объявим переменную типа ListView – listview , обратимся к элементу экрана из кода через findviewbyid
Давайте создадим новый класс которая нас будет отвечать за работу с данными в json файле и списком.
Назовем его UserAdapter , адаптер будет наследоваться от
Нам нужна будет int переменная listLayout , ArrayList list и как уже говорилось контекст, Context context .
Далее напишем конструктор
Напишем присвоение переменных
Ну теперь нам нужно будет сделать, как мы в прошлый раз делали, получение нашего View , создадим Layout inflator , который будет обращаться к объекту, к нашему файлу разметки row.xml для отображения пунктов списка.
Вот так у нас выглядит наш обработчик, здесь получилось, что мы меньше писали кода в классе UserAdapter чем в прошлом примере.
Теперь перейдем в mainactivity и продолжим, поскольку у нас массив users.json безымянный, нам проще обратиться к нашему файлу, чем если бы он имел имя.
Пишем в onCreate
И ниже, вне onCreate напишем функцию getJSonData
Объявим переменную и проинициализируем ее.
В блоке обработки исключений try/catch получим содержимое файла
Источник
Шпаргалка Java программиста 8. Библиотеки для работы с Json (Gson, Fastjson, LoganSquare, Jackson, JsonPath и другие)
В одной из моих прошлых статей я рассказывал о своем 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,
- Tree Model,
- Streaming API,
- (И дополнительный способ) Аналоги 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 классы (в разных примерах могут слегка отличаться наличием аннотаций, если они обязательны):
Как можно увидеть, Java классы всего лишь состоять из двух классов Human и Place, в которых храниться сообщение Hi World. Json тоже содержит эти два вложенных объекта.
Примеры использования (Data bind): Способ | Fastjson | Gson | LoganSquare | Moshi | Ig json parser | Jackson | Genson |
---|---|---|---|---|---|---|---|
Инициализация | — | Gson gson = new Gson() | — | Moshi moshi = new Moshi. Builder().build(); JsonAdapter 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.
Источник