Это руководство в основном предназначено для начинающих пользователей Android. JSON в Android — очень распространенная и простая для изучения тема.

Обязательное условие: Изучение JSON за 2 минуты @AndroidMonk

В этом уроке мы создадим приложение для Android и один файл JSON. Мы извлечем информацию из файла JSON и покажем ее в нашем приложении для Android.

Файл JSON содержит список фильмов. Ссылка на файл на GitHub: здесь

Загрузите этот файл или создайте аналогичный файл с помощью любого текстового редактора.

Начальные шаги

  • Создайте новый проект Android. Новый -> Новый проект -> Назовите этот проект как «Разбор JSON» -> Далее -> Далее -> Далее -> Готово.
  • Создайте папку ресурсов в проекте. Щелкните правой кнопкой мыши «приложение» на панели проекта «Android» (как показано ниже). Создать->Папка->Папка активов->Готово.

  • Скопируйте файл movieData.json со своего компьютера и вставьте его в папку с ресурсами.

Работа с пользовательским интерфейсом

Мы покажем данные внутри списка и текстового представления.

  • XML-код для main_activity.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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <!--It will show author details-->
    <TextView
        android:id="@+id/tvAuthor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="22sp"
        android:textColor="#FFFFFF"
        android:layout_centerHorizontal="true"
        android:layout_margin="16dp"
        android:padding="16dp"
        android:background="@color/colorPrimary"
        />

    <!--It will contain the details of movies-->
    <ListView
        android:id="@+id/lvMovies"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvAuthor"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        />

</RelativeLayout>
  • Создайте новый XML-файл с именем item_movies.xml внутри папки макета, который будет определять макет каждой строки фильма.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    >

    <!--It will display movie name-->
    <TextView
        android:id="@+id/tvMovie"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/colorPrimary"
        android:textSize="22sp"
        android:textStyle="bold"
        />

    <!--It will display year-->
    <TextView
        android:id="@+id/tvYear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/colorAccent"
        android:textSize="18sp"
        android:textStyle="bold"
        />

    <!--It will display rating-->
    <TextView
        android:id="@+id/tvRating"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#424242"
        android:textSize="18sp"
        android:textStyle="bold"
        />

</LinearLayout>

Написание кода Java

Код для MainActivity.java

package com.wiselteach.jsonparsing;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    TextView tvAuthorDetails;
    ListView lvMovies;

    // This array list will be used to store movies data temporarily and then pass that to listview.
    ArrayList<HashMap<String, String>> moviesArrayList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvAuthorDetails = (TextView) findViewById(R.id.tvAuthor);
        lvMovies = (ListView) findViewById(R.id.lvMovies);

        String fileData = ReadFromFile("moviesData.json");

        ConvertStringToJSON(fileData);

    }

    public String ReadFromFile(String fileName) {
        //Creating objects
        StringBuilder returnString = new StringBuilder();
        InputStream inputStream = null;
        InputStreamReader inputSteamReader = null;
        BufferedReader reader = null;
        try {
            inputStream = this.getResources().getAssets()
                    .open(fileName, Context.MODE_WORLD_READABLE);
            inputSteamReader = new InputStreamReader(inputStream);
            reader = new BufferedReader(inputSteamReader);
            String line = "";
            while ((line = reader.readLine()) != null) {
                returnString.append(line);
            }
        } catch (Exception e) {
            e.getMessage();
        } finally {
            //Error Handling
            try {
                if (inputSteamReader != null)
                    inputSteamReader.close();
                if (inputStream != null)
                    inputStream.close();
                if (reader != null)
                    reader.close();
            } catch (Exception e2) {
                e2.getMessage();
            }
        }

        //Return the output in string format
        return returnString.toString();
    }

    private void ConvertStringToJSON(String fileData) {
        //NOTE: For '{' we use JSON Object and for '[' we use JSON Array

        try {
            JSONObject completeData = new JSONObject(fileData);
            JSONObject moviesData = completeData.getJSONObject("movieData");
            JSONObject authorData = completeData.getJSONObject("authorData");

            //Using authorData Object to identify values from keys.
            String authorName = authorData.getString("name");
            String company = authorData.getString("company");
            String website = authorData.getString("website");
            tvAuthorDetails.setText(authorName + "\n" + company + "\n" +website);

            //Using movieData Object and setting data in list.
            JSONArray moviesList = moviesData.getJSONArray("moviesList");

            //Running loop for each array item
            for(int i = 0; i<moviesList.length(); i++){
                //Fetching data for each movie from object
                JSONObject currentMovieData = moviesList.getJSONObject(i);

                String name = currentMovieData.getString("movieName");
                String year = currentMovieData.getString("year");
                String rating = currentMovieData.getString("rating");

                HashMap<String,String> movies = new HashMap<>();
                movies.put("name", name);
                movies.put("year",year);
                movies.put("rating",rating);

                moviesArrayList.add(movies);
            }

            //Now we have completely read the json file
            //we will use the array list to display data in listview

            ListAdapter adapter = new SimpleAdapter(
                    MainActivity.this, // Context of the activity
                    moviesArrayList, // ArrayList containing data
                    R.layout.item_movies, // Layout which we will use to display data
                    new String[]{"name", "year", "rating"}, // Keys of hashmap to get values
                    new int[]{R.id.tvMovie, R.id.tvYear, R.id.tvRating} // Set values to textview accordingly.
            );

            lvMovies.setAdapter(adapter);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

}

Вывод

Теперь вы можете легко использовать синтаксический анализ JSON и просмотр списка в любом месте Android.

Добавляйте предложения в разделе комментариев.

#AndroidMonk

#WiseLTeach

#МудрыйL