JSON означает JavaScript Object Notation. Это независимый формат обмена данными и лучшая альтернатива XML. В этой главе объясняется, как анализировать файл JSON и извлекать из него необходимую информацию.
Android предоставляет четыре различных класса для управления данными JSON. Это классы JSONArray, JSONObject, JSONStringer и JSONTokenizer.
Первым шагом является определение полей в данных JSON, в которых вы заинтересованы. Например. В приведенном ниже JSON мы заинтересованы только в получении температуры.
{ "sys": { "country":"GB", "sunrise":1381107633, "sunset":1381149604 }, "weather":[ { "id":711, "main":"Smoke", "description":"smoke", "icon":"50n" } ], "main": { "temp":304.15, "pressure":1009, } }
JSON — Элементы
Файл JSON состоит из множества компонентов. Вот таблица, определяющая компоненты файла JSON и их описание —
Sr.No | Компонент и описание |
---|---|
1 |
Array ([) В файле JSON квадратная скобка ([) представляет массив JSON |
2 |
Объекты({) В файле JSON фигурная скобка ({) представляет объект JSON |
3 |
ключ Объект JSON содержит ключ, который является просто строкой. Пары ключ / значение составляют объект JSON |
4 |
Значение Каждый ключ имеет значение, которое может быть строковым, целым или двойным и т.д. |
Array ([)
В файле JSON квадратная скобка ([) представляет массив JSON
Объекты({)
В файле JSON фигурная скобка ({) представляет объект JSON
ключ
Объект JSON содержит ключ, который является просто строкой. Пары ключ / значение составляют объект JSON
Значение
Каждый ключ имеет значение, которое может быть строковым, целым или двойным и т.д.
JSON — Парсинг
Для анализа объекта JSON мы создадим объект класса JSONObject и укажем для него строку, содержащую данные JSON. Его синтаксис —
String in; JSONObject reader = new JSONObject(in);
Последний шаг — это разбор JSON. Файл JSON состоит из другого объекта с другой парой ключ / значение и т. Д. Таким образом, JSONObject имеет отдельную функцию для анализа каждого компонента файла JSON. Его синтаксис приведен ниже —
JSONObject sys = reader.getJSONObject("sys"); country = sys.getString("country"); JSONObject main = reader.getJSONObject("main"); temperature = main.getString("temp");
Метод getJSONObject возвращает объект JSON. Метод getString возвращает строковое значение указанного ключа.
Помимо этих методов, есть другие методы, предоставляемые этим классом для лучшего анализа файлов JSON. Эти методы перечислены ниже —
Sr.No | Метод и описание |
---|---|
1 |
получить (строковое имя) Этот метод просто возвращает значение, но в форме типа объекта |
2 |
getBoolean (имя строки) Этот метод возвращает логическое значение, указанное ключом |
3 |
getDouble (имя строки) Этот метод возвращает двойное значение, указанное ключом |
4 | getInt (Строковое имя)
Этот метод возвращает целочисленное значение, указанное ключом |
5 |
getLong (имя строки) Этот метод возвращает длинное значение, указанное ключом |
6 |
длина () Этот метод возвращает количество отображений имени / значения в этом объекте. |
7 |
имена () Этот метод возвращает массив, содержащий имена строк в этом объекте. |
получить (строковое имя)
Этот метод просто возвращает значение, но в форме типа объекта
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 .
package com.example.tutorialspoint7.myapplication; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; public class MainActivity extends AppCompatActivity { private String TAG = MainActivity.class.getSimpleName(); private ListView lv; ArrayList<HashMap<String, String>> contactList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contactList = new ArrayList<>(); lv = (ListView) findViewById(R.id.list); new GetContacts().execute(); } private class GetContacts extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); Toast.makeText(MainActivity.this,"Json Data is downloading",Toast.LENGTH_LONG).show(); } @Override protected Void doInBackground(Void... arg0) { HttpHandler sh = new HttpHandler(); // Making a request to url and getting response String url = "http://api.androidhive.info/contacts/"; String jsonStr = sh.makeServiceCall(url); Log.e(TAG, "Response from url: " + jsonStr); if (jsonStr != null) { try { JSONObject jsonObj = new JSONObject(jsonStr); // Getting JSON Array node JSONArray contacts = jsonObj.getJSONArray("contacts"); // looping through All Contacts for (int i = 0; i < contacts.length(); i++) { JSONObject c = contacts.getJSONObject(i); String id = c.getString("id"); String name = c.getString("name"); String email = c.getString("email"); String address = c.getString("address"); String gender = c.getString("gender"); // Phone node is JSON Object JSONObject phone = c.getJSONObject("phone"); String mobile = phone.getString("mobile"); String home = phone.getString("home"); String office = phone.getString("office"); // tmp hash map for single contact HashMap<String, String> contact = new HashMap<>(); // adding each child node to HashMap key => value contact.put("id", id); contact.put("name", name); contact.put("email", email); contact.put("mobile", mobile); // adding contact to contact list contactList.add(contact); } } catch (final JSONException e) { Log.e(TAG, "Json parsing error: " + e.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Json parsing error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } }); } } else { Log.e(TAG, "Couldn't get json from server."); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Couldn't get json from server. Check LogCat for possible errors!", Toast.LENGTH_LONG).show(); } }); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); ListAdapter adapter = new SimpleAdapter(MainActivity.this, contactList, R.layout.list_item, new String[]{ "email","mobile"}, new int[]{R.id.email, R.id.mobile}); lv.setAdapter(adapter); } } }
Ниже приведено измененное содержимое XML- файла HttpHandler.java .
package com.example.tutorialspoint7.myapplication; import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; public class HttpHandler { private static final String TAG = HttpHandler.class.getSimpleName(); public HttpHandler() { } public String makeServiceCall(String reqUrl) { String response = null; try { URL url = new URL(reqUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // read the response InputStream in = new BufferedInputStream(conn.getInputStream()); response = convertStreamToString(in); } catch (MalformedURLException e) { Log.e(TAG, "MalformedURLException: " + e.getMessage()); } catch (ProtocolException e) { Log.e(TAG, "ProtocolException: " + e.getMessage()); } catch (IOException e) { Log.e(TAG, "IOException: " + e.getMessage()); } catch (Exception e) { Log.e(TAG, "Exception: " + e.getMessage()); } return response; } private String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line; try { while ((line = reader.readLine()) != null) { sb.append(line).append('\n'); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } }
Ниже приводится измененное содержимое файла xml res / layout / activity_main.xml .
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.tutorialspoint7.myapplication.MainActivity"> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </RelativeLayout>
Ниже приведено измененное содержимое xml res / layout / list_item.xml .
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="@dimen/activity_horizontal_margin"> <TextView android:id="@+id/email" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="2dip" android:textColor="@color/colorAccent" /> <TextView android:id="@+id/mobile" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#5d5d5d" android:textStyle="bold" /> </LinearLayout>
Ниже приводится содержимое файла AndroidManifest.xml .
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tutorialspoint7.myapplication"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Давайте попробуем запустить наше приложение, которое мы только что изменили. Я предполагаю, что вы создали свой AVD во время настройки среды. Чтобы запустить приложение из студии Android, откройте один из файлов деятельности вашего проекта и нажмите «Выполнить». значок с панели инструментов. Android-студия устанавливает приложение на AVD и запускает его, и, если все в порядке с настройками и приложением, оно отобразится в следующем окне эмулятора —
Приведенный выше пример, показывающий данные из строки json, содержит данные работодателя, а также информацию о зарплате.