JSON означает JavaScript Object Notation. Это независимый формат обмена данными и лучшая альтернатива XML. В этой главе объясняется, как анализировать файл JSON и извлекать из него необходимую информацию.
Android предоставляет четыре различных класса для управления данными JSON. Это классы JSONArray, JSONObject, JSONStringer и JSONTokenizer.
Первым шагом является определение полей в данных JSON, в которых вы заинтересованы. Например. В приведенном ниже JSON мы заинтересованы только в получении температуры.
JSON — Элементы
Файл JSON состоит из множества компонентов. Вот таблица, определяющая компоненты файла JSON и их описание —
Sr.No
Компонент и описание
1
В файле JSON квадратная скобка ([) представляет массив JSON
В файле JSON фигурная скобка (<) представляет объект JSON
Объект JSON содержит ключ, который является просто строкой. Пары ключ / значение составляют объект JSON
Каждый ключ имеет значение, которое может быть строковым, целым или двойным и т.д.
В файле JSON квадратная скобка ([) представляет массив JSON
В файле JSON фигурная скобка (<) представляет объект JSON
Объект JSON содержит ключ, который является просто строкой. Пары ключ / значение составляют объект JSON
Каждый ключ имеет значение, которое может быть строковым, целым или двойным и т.д.
JSON — Парсинг
Для анализа объекта JSON мы создадим объект класса JSONObject и укажем для него строку, содержащую данные JSON. Его синтаксис —
Последний шаг — это разбор JSON. Файл JSON состоит из другого объекта с другой парой ключ / значение и т. Д. Таким образом, JSONObject имеет отдельную функцию для анализа каждого компонента файла JSON. Его синтаксис приведен ниже —
Метод getJSONObject возвращает объект JSON. Метод getString возвращает строковое значение указанного ключа.
Помимо этих методов, есть другие методы, предоставляемые этим классом для лучшего анализа файлов JSON. Эти методы перечислены ниже —
Sr.No
Метод и описание
1
получить (строковое имя)
Этот метод просто возвращает значение, но в форме типа объекта
getBoolean (имя строки)
Этот метод возвращает логическое значение, указанное ключом
getDouble (имя строки)
Этот метод возвращает двойное значение, указанное ключом
4
getInt (Строковое имя)
Этот метод возвращает целочисленное значение, указанное ключом
getLong (имя строки)
Этот метод возвращает длинное значение, указанное ключом
Этот метод возвращает количество отображений имени / значения в этом объекте.
Этот метод возвращает массив, содержащий имена строк в этом объекте.
получить (строковое имя)
Этот метод просто возвращает значение, но в форме типа объекта
getBoolean (имя строки)
Этот метод возвращает логическое значение, указанное ключом
getDouble (имя строки)
Этот метод возвращает двойное значение, указанное ключом
Этот метод возвращает целочисленное значение, указанное ключом
getLong (имя строки)
Этот метод возвращает длинное значение, указанное ключом
Этот метод возвращает количество отображений имени / значения в этом объекте.
Этот метод возвращает массив, содержащий имена строк в этом объекте.
пример
Чтобы поэкспериментировать с этим примером, вы можете запустить его на реальном устройстве или в эмуляторе.
меры
Описание
1
Вы будете использовать Android studio для создания приложения Android.
2
Измените файл src / MainActivity.java, чтобы добавить необходимый код.
3
Измените res / layout / activity_main, чтобы добавить соответствующие компоненты XML
4
Измените файл res / values / string.xml, чтобы добавить необходимые строковые компоненты
5
Запустите приложение и выберите работающее устройство Android, установите на него приложение и проверьте результаты.
Ниже приводится содержимое измененного основного файла активности src / MainActivity.java .
Ниже приведено измененное содержимое XML- файла HttpHandler.java .
Ниже приводится измененное содержимое файла xml res / layout / activity_main.xml .
Ниже приведено измененное содержимое xml res / layout / list_item.xml .
Ниже приводится содержимое файла AndroidManifest.xml .
Давайте попробуем запустить наше приложение, которое мы только что изменили. Я предполагаю, что вы создали свой AVD во время настройки среды. Чтобы запустить приложение из студии Android, откройте один из файлов деятельности вашего проекта и нажмите «Выполнить». значок с панели инструментов. Android-студия устанавливает приложение на AVD и запускает его, и, если все в порядке с настройками и приложением, оно отобразится в следующем окне эмулятора —
Приведенный выше пример, показывающий данные из строки json, содержит данные работодателя, а также информацию о зарплате.
Источник
Урок 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 всё в порядке:
Источник
JSON Parsing in Android using Android Studio
Usually, most of the application require interchanging of data from the server. During interchanging data, well formatted and structured data is required. JSON parsing is good and well structured, lightweight and easy to parse and human readable. In this tutorial, we will focus how to parse to JSON in Android Studio.
JSON Parsing in Android using Android Studio
We are going to use very simple JSON in this tutorial, which contains list of students while each node have id,name,gender and phone attributes of a student.
[thrive_lead_lock >You can download the complete source code of this tutorial here.
Usually, JSON contains two types of nodes, JSONArray and JSONObject. So while parsing the JSON node we have to use the appropriate method. If JSON starts from [ represent JSONArray and if starts from < represent JSONObject.
So if JSON starting from [, we use the getJSONArray method to parse. and same as if JSON start with < we should use the getJSONObject method.
getJSONObject method.
Create new android project
Start Android Studio and create a new Android project.
We are getting JSON from the internet by making an HTTP call so we need to add internet permission in the project.
Manifest file
Handling HTTP calls
We will use separate class for making the HTTP calls, which can use both GET and POST method for HTTP calls and also could send parameters. So create a WebRequest.JAVA class and add the following code. makeWebServiceCall(String urladdress, int requestmethod, HashMap params) should be called in order to make HTTP calls, whose parameter are urladdress – URL which is to be called requestmethod – HTTP request method either GET or POST params – (Optional) if need to send any parameter with request
We will use listview to show parsed data, so add list view in your MainActivity layout file. As our MainActivity will be ListActivit so keep list view id @android:id/list for the main list. activity_main.xml
Now, in MainActivity declare all JSON nodes and get list view reference.
public class MainActivity extends ListActivity < // URL to get contacts JSON private static String url = «https://raw.githubusercontent.com/mobilesiri/JSON-Parsing-in-Android/master/index.html»;
// JSON Node names private static final String TAG_STUDENT_INFO = «studentsinfo»; private static final String TAG_ID = «id»; private static final String TAG_STUDENT_NAME = «sname»; private static final String TAG_STUDENTEMAIL = «semail»; private static final String TAG_ADDRESS = «address»; private static final String TAG_STUDENT_GENDER = «gender»; private static final String TAG_STUDENT_PHONE = «sphone»; private static final String TAG_STUDENT_PHONE_MOBILE = «mobile»; private static final String TAG_STUDENT_PHONE_HOME = «home»;
I add a method ParseJSON which is taking JSON as parameter and retuning HashMap ArrayList of data. Note getJSONArray() or getJSONObject() depend on JSON nodes.
private ArrayList > ParseJSON(String json) < if (json != null) < try < // Hashmap for ListView ArrayList > studentList = new ArrayList >(); JSONObject jsonObj = new JSONObject(json);
// Getting JSON Array node JSONArray students = jsonObj.getJSONArray(TAG_STUDENT_INFO);
// looping through All Students for (int i = 0; i String sname = c.getString(TAG_STUDENT_NAME); String email = c.getString(TAG_EMAIL); String address = c.getString(TAG_ADDRESS); String gender = c.getString(TAG_STUDENT_GENDER);
// Phone node is JSON Object JSONObject phone = c.getJSONObject(TAG_STUDENT_PHONE); String mobile = phone.getString(TAG_STUDENT_PHONE_MOBILE); String home = phone.getString(TAG_STUDENT_PHONE_HOME);
// tmp hashmap for single student HashMap student = new HashMap ();
// adding every child node to HashMap key => value student.put(TAG_ID, id); student.put(TAG_STUDENT_NAME, sname); student.put(TAG_EMAIL, email); student.put(TAG_STUDENT_PHONE_MOBILE, mobile);
// adding student to students list studentList.add(student); > return studentList; > catch (JSONException e) < e.printStackTrace(); return null; > > else < Log.e(«ServiceHandler», «No data received from HTTP request»); return null; > >
For making HTTP call to get JSON, we need to add Async class to make HTTP call in the background. In onPreExecute method, we add a Dialog before calling the URL In doInBackground, we call method makeWebServiceCall to get JSON and ParseJSON to parse data. In onPostExecute I dismiss dialog, and create a list Adapter and set to ListView.
private class GetStudents extends AsyncTask <
// Hashmap for ListView ArrayList > studentList; ProgressDialog proDialog;
@Override protected Void doInBackground(Void. arg0) < // Creating service handler class instance WebRequest webreq = new WebRequest();
// Making a request to url and getting response String jsonStr = webreq.makeWebServiceCall(url, WebRequest.GETRequest);
@Override protected void onPostExecute(Void requestresult) < super.onPostExecute(requestresult); // Dismiss the progress dialog if (proDialog.isShowing()) proDialog.dismiss(); /** * Updating received data from JSON into ListView * */ ListAdapter adapter = new SimpleAdapter( MainActivity.this, studentList, R.layout.list_item, new String[] TAG_STUDENT_PHONE_MOBILE>, new int[] R.id.email, R.id.mobile>);
>
Now run the code you will find the data is populated in ListView
// Calling async task to get json new GetStudents().execute(); > /** * Async task class to get json by making HTTP call */ private class GetStudents extends AsyncTask <
// Hashmap for ListView ArrayList > studentList; ProgressDialog proDialog;
@Override protected void onPreExecute() < super.onPreExecute(); // Showing progress loading dialog proDialog = new ProgressDialog(MainActivity.this); proDialog.setMessage(«Please wait. «); proDialog.setCancelable(false); proDialog.show(); > @Override protected Void doInBackground(Void. arg0) < // Creating service handler class instance WebRequest webreq = new WebRequest();
// Making a request to url and getting response String jsonStr = webreq.makeWebServiceCall(url, WebRequest.GETRequest);
return null; > @Override protected void onPostExecute(Void requestresult) < super.onPostExecute(requestresult); // Dismiss the progress dialog if (proDialog.isShowing()) proDialog.dismiss(); /** * Updating received data from JSON into ListView * */ ListAdapter adapter = new SimpleAdapter( MainActivity.this, studentList, R.layout.list_item, new String[] TAG_STUDENT_PHONE_MOBILE>, new int[] R.id.email, R.id.mobile>);
> private ArrayList > ParseJSON(String json) < if (json != null) < try < // Hashmap for ListView ArrayList > studentList = new ArrayList >();
JSONObject jsonObj = new JSONObject(json);
// Getting JSON Array node JSONArray students = jsonObj.getJSONArray(TAG_STUDENT_INFO);
// looping through All Students for (int i = 0; i String name = c.getString(TAG_STUDENT_NAME); String email = c.getString(TAG_EMAIL); String address = c.getString(TAG_ADDRESS); String gender = c.getString(TAG_STUDENT_GENDER);
// Phone node is JSON Object JSONObject phone = c.getJSONObject(TAG_STUDENT_PHONE); String mobile = phone.getString(TAG_STUDENT_PHONE_MOBILE); String home = phone.getString(TAG_STUDENT_PHONE_HOME);
// tmp hashmap for single student HashMap student = new HashMap ();