- Kotlin Android – Read JSON file from assets using Gson
- Where to put assets folder and JSON file
- Create Data Class
- Create function for reading JSON file from assets
- Parse JSON using Gson
- Gson.fromJson() method
- Add Gson to Android project
- Parse JSON string to Kotlin object
- Conclusion
- Java Android – Read JSON file from assets using Gson
- Where to put assets folder and JSON file
- Create Java Data Class
- Create function for reading JSON file from assets
- Parse JSON using Gson
- Gson.fromJson() method
- Add Gson to Android project
- Parse JSON string to Java object
- Conclusion
- Android- Parsing Local JSON Data (assets folder) (HELP)
- Урок 14. Знакомство с форматом JSON. Парсинг JsonObject на примере объекта User
- JSONObject, работа с JSON в java коде
- Android: парсим JSON правильно
- Сериализация от Kotlin
- Сериализация от Kotlin + Retrofit
- Сериализация от Kotlin
- Сериализация от Kotlin + Retrofit
Kotlin Android – Read JSON file from assets using Gson
In this Kotlin-Android tutorial, I will show you how to read and parse JSON file from assets using Gson.
Where to put assets folder and JSON file
You will need to create the assets folder inside src/main, next to your java and res folder. Then make sure that your JSON file is within your assets folder.
For example, bezkoder.json file contains list of people data like this.
Create Data Class
Let’ create Person class with 3 fields: name, age, messages.
Create function for reading JSON file from assets
We’re gonna create a Utils class and add the function that will read JSON file from assets.
The function has 2 parameters: context & fileName .
– We get AssetManager object from context by context.assets , then use AssetManager.open() method to open a file in assets folder using ACCESS_STREAMING mode, it returns an InputStream .
– Then bufferedReader() creates a buffered reader on the InputStream and readText() helps us to read this reader as a String.
Parse JSON using Gson
Gson.fromJson() method
com.google.gson.Gson package provides fromJson() for deserializing JSON.
- T : type of the desired object
- json : could be a JsonElement object, a Reader object or a String
- classOfT : class of T
- typeOfT : specific genericized type
Add Gson to Android project
Gson is a Java/Kotlin library for converting JSON string to an equivalent Java/Kotlin object.
Open build.gradle file and add Gson library.
Parse JSON string to Kotlin object
In your activity, import Gson library and call getJsonDataFromAsset() .
Check Android Logcat, you can see:
In the code above, we use Gson.fromJson() method to parse JSON string to List
For more details about ways to parse JSON to Data Class object, to Array or Map , please visit:
Kotlin – Convert object to/from JSON string using Gson
Conclusion
Let me summarize what we’ve done in this tutorial:
- put assets folder & JSON file in the right place
- create data class corresponding to JSON content
- use AssetManager to open the File, then get JSON string
- use Gson to parse JSON string to Kotlin object
Источник
Java Android – Read JSON file from assets using Gson
In this Java-Android tutorial, I will show you how to read and parse JSON file from assets using Gson.
Where to put assets folder and JSON file
You will need to create the assets folder inside src/main, together with java and res folder. Then put JSON file inside assets folder.
For example, bezkoder.json file contains list of people data like this.
Create Java Data Class
Let’ create User class with 3 fields: name, age, messages.
Create function for reading JSON file from assets
Let’s a Utils class and add a static function that will read JSON file from assets.
You can see that getJsonFromAssets() function has 2 parameters: context & fileName .
– We get AssetManager object from context by context.assets , then use AssetManager.open() method to open a file in assets folder using ACCESS_STREAMING mode, it returns an InputStream .
– Then we use InputStream.read() to read data into byte[] buffer and readText() to transform the buffer into a String.
Parse JSON using Gson
Gson.fromJson() method
com.google.gson.Gson package provides fromJson() for deserializing JSON.
- T : type of the desired object
- json : could be a JsonElement object, a Reader object or a String
- classOfT : class of T
- typeOfT : specific genericized type
Add Gson to Android project
Gson is a Java library for converting JSON string to an equivalent Java object.
Open build.gradle file and add Gson library.
Parse JSON string to Java object
In your activity, import Gson library and call getJsonFromAssets() .
Now, open Android Logcat window and you can see:
Conclusion
Let me summarize what we’ve done in this tutorial:
Источник
Android- Parsing Local JSON Data (assets folder) (HELP)
I am making a test app with Android. I have a json file and i want to read it into activity class. The problem is that code doesn’t get JSON data and write the data into the textView.
Here is the json file.
And here is the QuizActivityAdjectives.java file.
It doesn’t get into the if (questions.size() > 0) block. Which means size is not bigger than 0. The size must be > 0 regarding upside codes. Can someone please help me?
Your JSON content is broken — this JSON Online Parser might help. Also, the type of the id attribute in the JSON content and your application code do not match.
The JSON parser should have complained about both of these problems — check the LogCat output.
Ron McLeod wrote: Your JSON content is broken — this JSON Online Parser might help. Also, the type of the id attribute in the JSON content and your application code do not match.
The JSON parser should have complained about both of these problems — check the LogCat output.
Should it be like this? And is it matching my parsing java code?
The id matter you if you mean having a letter and described as int, the id probably will not be necessary but does its being wrong effect the running and fetching json data question?
ensar topbas wrote: Should it be like this?
Well .. maybe — you didn’t show all of the JSON content, but adding a commas after the optionD values would have fixed the problem I saw.
For the id attribute, either change the JSON content so that id is a number, or leave it as-is and parse it as a String. Didn’t you see something like this is the log?:
W/System.err: org.json.JSONException: Value a200 at id of type java.lang.String cannot be converted to int
W/System.err: at org.json.JSON.typeMismatch(JSON.java:100)
W/System.err: at org.json.JSONObject.getInt(JSONObject.java:481)
ensar topbas wrote: Should it be like this?
Well .. maybe — you didn’t show all of the JSON content, but adding a commas after the optionD values would have fixed the problem I saw.
For the id attribute, either change the JSON content so that id is a number, or leave it as-is and parse it as a String. Didn’t you see something like this is the log?:
W/System.err: org.json.JSONException: Value a200 at id of type java.lang.String cannot be converted to int
W/System.err: at org.json.JSON.typeMismatch(JSON.java:100)
W/System.err: at org.json.JSONObject.getInt(JSONObject.java:481)
Thank you so much. I wouldn’t ever expect but that id matter has been affecting the fetching process.
By the way, my logcat doesn’t show me any error like you’ve written. Can i learn how could you get it?
Источник
Урок 14. Знакомство с форматом JSON. Парсинг JsonObject на примере объекта User
В этом уроке мы с вами более подробно познакомимся с форматом JSON . А потом из этого формата получим наш User объект.
JSON стал общепринятым форматом для обмена данными в клиент-серверных приложения. Он является универсальным форматом для обмена данными.
Представьте, что вам нужно создать систему приложений, в которую входит, сервер, web -клиент, ios -клиент, android -клиент. У всех технологий разные языки,
разные особенности. Поэтому сервер отвечает в формате JSON , а клиенты на своей стороне приводят к нужному формату ответы. Подробнее про JSON формат можно
почитать здесь, но на данном этапе ваших знаний уже вполне хватит.
JSONObject, работа с JSON в java коде
Давайте создадим новый класс в пакете network и назовём его JsonParser для преобразования Json -строк в необходимые нам объекты. Добавим в него один
метод, который назовём getUser(String response) :
Мы будем использовать этот метод внутри класса HttpClient , передавая в него ответ от сервера в формате String , возвращая объект User . Давайте
разберём преобразование, рассмотрим структура хранения JSON . В прошлом уроке мы в конце вывели ответ от сервера в log и увидели очень большой объект JSON .
На данном этапе нам необходимы только те поля, которые мы отображаем на экране. Поэтому опустим остальные поля и оставим только те, которые нам нужны:
Видим, что наш JSON полностью повторяет структуру нашего объекта User . Теперь можно приступить к парсингу (преобразованию) данных.
Первое, что необходимо сделать – это создать JSON объект из строки:
Видим, что AndroidStudio подчёркивает эту строку, указывая что надо обработать исключение или добавить его к сигнатуре метода. Можем нажать alt + enter
и увидеть два этих варианта решения проблемы. Добавим исключение к сигнатуре, чтобы обработать исключения в клиентском коде. Для этого выберем вариант Add exception to method signature :
JSONObject представляет из себя структуру типа HashMap (ключ – значение).
Т.е. чтобы получить значения поля id нам необходимо выполнить вызов метода
userJson.getLong(«id») (получить значение типа long по ключу (названию поля) id ). Давайте сделаем тоже самое для каждого поля.
После этого метод будет выглядеть так:
Т.е. вот так по названию поля мы можем достать его значение. Нам попался самый простой случай, где наши значения являются примитивными типами. На практике мы
поработаем с массивами элементов и вложенными объектами.
Давайте создадим объект User , передав ему в конструктор все поля, которые мы только что достали из userJson :
Вот и всё! Теперь давайте добавим использование нашего класса внутри класса HttpClient .
Добавили JsonParser как final поле в классе HttpClient и инициализируем его в конструкторе.
После этого добавили строку User user = jsonParser.getUser(response); в конец метода getUserInfo и поменяли возвращаемый тип на User и добавили новое
исключение JSONException в сигнатуру метода. Отлично, теперь изменим код в UserInfoActivity и запустим приложение.
в UserInfoActivity нам нужно изменить метод loadUserInfo :
Возвращаемый тип Asynctask со String на User .
Добавили в catch блок перехват исключения типа IOException | JSONException .
В onPostExecute мы заменили вызов Log.d() на вызов реального метода отображения displayUserInfo(user) .
Давайте запустим наше приложение:
Всё работает! Только видим, что наш ник выводится без символа @ . Давайте изменим метод getNick() в классе User . Будем добавлять в него символ @ самостоятельно, т.к. сервер этого не сделал.
Запустим наше приложение и увидим, что теперь с форматом поля nick всё в порядке:
Источник
Android: парсим JSON правильно
Любой Android-разработчик рано или поздно сталкивается с форматом представления данных типа JSON. Наиболее часто он используется для передачи/получения данных с какого-либо сервера. Формат предельно прост, подробнее о нём можно почитать в Википедии:
«JSON (JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/ JAY-sən) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми. Несмотря на происхождение от JavaScript, формат считается независимым от языка и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON».
Любой класс в Java или Kotlin можно представить в виде структуры JSON, где есть поля, атрибуты, фигурные скобки обозначают объект, квадратные скобки — массив.
Следующий пример показывает JSON-представление данных об объекте, описывающем человека. В данных присутствуют строковые поля имени и фамилии, информация об адресе и массив, содержащий список телефонов. Как видно из примера, значение может представлять собой вложенную структуру:
Наиболее популярный среди разработчиков способ трансформировать данные в JSON и обратно — это библиотека GSON от самих разработчиков Google. Она очень проста в использовании, мало весит и интегрирована во многие библиотеки.
На данный момент все, за редким исключением, Android-разработчики используют Kotlin, а GSON (как и другие подобные библиотеки типа Jackson или Moshi) написана на Java. Это не страшно, потому что Kotlin и Java полностью взаимозаменяемы, но есть небольшие нюансы, которые могут привести к совершенно неожиданным результатам.
Давайте создадим класс User и посмотрим на эти нюансы на практике. В этом классе у нас будут обычные поля и поля со значениями по умолчанию. Как вы знаете, в Java нельзя присваивать переменным значения по умолчанию, а в Kotlin можно:
И теперь представим, что с какого-то сервера пришли данные о пользователе в формате JSON:
Теперь нам нужно распарсить этот JSON и превратить его в обычный класс Kotlin с помощью библиотеки GSON. Добавим зависимость GSON в наш проект в файл Gradle
и сразу напишем тест:
Тест прекрасно выполняется без единой ошибки, то есть код работает. Но обратите внимание, что возраст пользователя у нас == 0, а его роль не определена, хотя в самом классе у нас прописаны значения по умолчанию для этих переменных. Если эти параметры не определены в JSON, должны подставляться значения по умолчанию: возраст == 13, а роль == Viewer, но они не подставляются, а код всё равно работает. Вот так неожиданность! Не такого поведения мы ожидали!
Давайте разбираться. Дело в том, что, как мы писали выше, библиотека GSON написана на Java, а это значит, что значения по умолчанию для несуществующих полей такие: для примитива int — это 0, для отсутствующего объекта — это null. Простая трансформация JSON в класс на Kotlin может легко сломать null-safety, на который так рассчитывают все разработчики, и может привести к падению приложения там, где оно падать не должно.
И тут нам на помощь приходит котлиновская библиотека по сериализации объектов.
Сериализация от Kotlin
Это небольшая вспомогательная библиотечка от разработчиков языка, которая работает с помощью аннотации @Serializable. С ней у вас не будет проблем при использовании полей по умолчанию. Чтобы подключить библиотеку к своему проекту, нужно прописать в файле Gradle плагин и несколько зависимостей. В файле проекта build.gradle(Project):
В файле проекта build.gradle(Module:app):
Теперь трансформация JSON (сериализация) будет проходить корректно. Напишем наш класс и добавим аннотацию:
Тест пройден успешно! Теперь класс сериализуется у нас со значениями по умолчанию, если таковые прописаны в классе.
Сериализация от Kotlin + Retrofit
Если вы хоть раз отправляли запрос на сервер или получали с сервера какой-то ответ, то наверняка вы знакомы с библиотекой Retrofit. В этой библиотеке нет поддержки сериализации от Kotlin, но у вас есть возможность добавить вспомогательную библиотеку от Джека Вортона в качестве зависимости Gradle:
Теперь при использовании Retrofit сериализация будет происходить автоматически:
Дополнительно, но не обязательно вы можете использовать JsonConfiguration для выключения StrictMode. StrictMode включен по умолчанию и запрещает использование неизвестных ключей в JSON и нечисловые значения в числах с плавающей точкой. Хорошая практика — включать StrictMode в «дебажной» версии приложения и выключать его в «релизной».
Читайте больше полезных статей для начинающих Android-разработчиков:
А если затянет — приходите на факультет Android-разработки. В время учебы вы разработаете Android-приложение и выложите его в Google Play, даже если никогда не программировали. А также своите языки Java и Kotlin, командную разработку, Material Design и принципы тестирования.
Любой Android-разработчик рано или поздно сталкивается с форматом представления данных типа JSON. Наиболее часто он используется для передачи/получения данных с какого-либо сервера. Формат предельно прост, подробнее о нём можно почитать в Википедии:
«JSON (JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/ JAY-sən) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми. Несмотря на происхождение от JavaScript, формат считается независимым от языка и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON».
Любой класс в Java или Kotlin можно представить в виде структуры JSON, где есть поля, атрибуты, фигурные скобки обозначают объект, квадратные скобки — массив.
Следующий пример показывает JSON-представление данных об объекте, описывающем человека. В данных присутствуют строковые поля имени и фамилии, информация об адресе и массив, содержащий список телефонов. Как видно из примера, значение может представлять собой вложенную структуру:
Наиболее популярный среди разработчиков способ трансформировать данные в JSON и обратно — это библиотека GSON от самих разработчиков Google. Она очень проста в использовании, мало весит и интегрирована во многие библиотеки.
На данный момент все, за редким исключением, Android-разработчики используют Kotlin, а GSON (как и другие подобные библиотеки типа Jackson или Moshi) написана на Java. Это не страшно, потому что Kotlin и Java полностью взаимозаменяемы, но есть небольшие нюансы, которые могут привести к совершенно неожиданным результатам.
Давайте создадим класс User и посмотрим на эти нюансы на практике. В этом классе у нас будут обычные поля и поля со значениями по умолчанию. Как вы знаете, в Java нельзя присваивать переменным значения по умолчанию, а в Kotlin можно:
И теперь представим, что с какого-то сервера пришли данные о пользователе в формате JSON:
Теперь нам нужно распарсить этот JSON и превратить его в обычный класс Kotlin с помощью библиотеки GSON. Добавим зависимость GSON в наш проект в файл Gradle
и сразу напишем тест:
Тест прекрасно выполняется без единой ошибки, то есть код работает. Но обратите внимание, что возраст пользователя у нас == 0, а его роль не определена, хотя в самом классе у нас прописаны значения по умолчанию для этих переменных. Если эти параметры не определены в JSON, должны подставляться значения по умолчанию: возраст == 13, а роль == Viewer, но они не подставляются, а код всё равно работает. Вот так неожиданность! Не такого поведения мы ожидали!
Давайте разбираться. Дело в том, что, как мы писали выше, библиотека GSON написана на Java, а это значит, что значения по умолчанию для несуществующих полей такие: для примитива int — это 0, для отсутствующего объекта — это null. Простая трансформация JSON в класс на Kotlin может легко сломать null-safety, на который так рассчитывают все разработчики, и может привести к падению приложения там, где оно падать не должно.
И тут нам на помощь приходит котлиновская библиотека по сериализации объектов.
Сериализация от Kotlin
Это небольшая вспомогательная библиотечка от разработчиков языка, которая работает с помощью аннотации @Serializable. С ней у вас не будет проблем при использовании полей по умолчанию. Чтобы подключить библиотеку к своему проекту, нужно прописать в файле Gradle плагин и несколько зависимостей. В файле проекта build.gradle(Project):
В файле проекта build.gradle(Module:app):
Теперь трансформация JSON (сериализация) будет проходить корректно. Напишем наш класс и добавим аннотацию:
Тест пройден успешно! Теперь класс сериализуется у нас со значениями по умолчанию, если таковые прописаны в классе.
Сериализация от Kotlin + Retrofit
Если вы хоть раз отправляли запрос на сервер или получали с сервера какой-то ответ, то наверняка вы знакомы с библиотекой Retrofit. В этой библиотеке нет поддержки сериализации от Kotlin, но у вас есть возможность добавить вспомогательную библиотеку от Джека Вортона в качестве зависимости Gradle:
Теперь при использовании Retrofit сериализация будет происходить автоматически:
Дополнительно, но не обязательно вы можете использовать JsonConfiguration для выключения StrictMode. StrictMode включен по умолчанию и запрещает использование неизвестных ключей в JSON и нечисловые значения в числах с плавающей точкой. Хорошая практика — включать StrictMode в «дебажной» версии приложения и выключать его в «релизной».
Читайте больше полезных статей для начинающих Android-разработчиков:
А если затянет — приходите на факультет Android-разработки. В время учебы вы разработаете Android-приложение и выложите его в Google Play, даже если никогда не программировали. А также своите языки Java и Kotlin, командную разработку, Material Design и принципы тестирования.
Источник