Всем привет, в этой статье я расскажу вам, как в Android Studio можно работать с json файлами.

Это будет первая статья, поскольку есть различия в работе с json, существует массив с именем, или не именной, можно выводить данные в recyclerview или listview, поэтому будут различные подходы в парсинге.

Смотрите видео: Android Studio: получение JSON в RecyclerView и CardView. Урок № 1

Это будет первая статья, затем мы перейдём к парсингу JSON файлов с хостинга. Но это будет немного позже начнем с самого простого примера, локального файла в папке assets.

Создадим новый проект, выбираем empty Activity, давайте назовём приложение, например, Load Json from assets-01.

Идёт подготовка проекта, в нем мы будем использовать не listView будем использовать recyclerview и cardview.

А пока, если хотите можете поставить на паузу ролик и повторять то, что я пишу, и какие изменения делаю.

В файл build.gradle проекта внесем записи

implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'

это recyclerview и cardview для вывода данных и синхронизируем проект.

Всё хорошо, теперь займемся работой с нашими слоями в activity_main.xml введем RelativeLayout а в него androidx.recyclerview.widget с android:id="@+id/recyclerView".

Не будем делать фрагменты, в данном примере будет при запуске сразу отображаться нужная информация.

Создадим еще один слой назовем его row.xml в нем androidx.cardview.widget.CardView, LinearLayout с двумя TextView с android:id="@+id/name" и android:id="@+id/email" соответственно.

Слой row

Хочу рассказать о json файле с которым будем работать, он состоит из идентификатора пользователя (id), имени пользователя (name) и электронной почты (email), то есть начнём с простейшего примера и далее будем это всё выводить.

{"users":[
  {
    "id":"1",
    "name": "Коля",
    "email":"daaksha@ gmail.com" //пробелы в почте специально!!! при копировании удалить вместе с комментом
  },

  {"id":"2",
    "name": "Вася",
    "email":"abc@ gmail.com" 
  },

  {"id":"3",
    "name": "Федя",
    "email":"def@ gmail.com" 
  },
  {"id":"4",
    "name": "Юра",
    "email":"xyz@ gmail.com" 
  }
]
}

Создадим в папке проекта New File Folder дикторию assets, и в ней нужно будет создать файл users.json.

Я заполнил его такими данными, название нашего массива – users, в нем поля - id, name, email, чисто случайные данные, для наглядности. В принципе больше нечего с ним мы делать не будем.

Теперь поработаем в файле mainactivity.java. Нам нужно будет объявить переменную recyclerView с типом RecyclerView перед onCreate, нужно связать список через findViewById(R.id.recyclerView).

Опишем LinearLayoutManager:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext())

и передадим управление recyclerView

recyclerView.setLayoutManager(linearLayoutManager).

Так же нужно будет создать новый класс Java New Class, назовем его HelperAdapter для работы со списком, с данными json.

Он будет наследоваться от

RecyclerView.Adapter< HelperAdapter.MyViewClass >

MyViewClass мы напишем позже.

Выглядит это всё достаточно сложно на первый взгляд, но потом можно будет использовать этот код, вносить небольшие правки в именах полей и тому подобном. Делается практически один раз и нам не нужно будет создать каждый раз для аналогичных проектов.

Создаем

ArrayList< String > name;
ArrayList< String > email;

для хранения имя и почты пользователей из users.json файла, поле id использовать в этом примере не будем.

Также объявим переменную для контекста,

Context context;

будем определять его для работы с mainactivaty.

В конструкторе HelperAdapter

public HelperAdapter(ArrayList< String > name, ArrayList< String > email, Context context) {
        this.name = name;
        this.email = email;
        this.context = context;
    }

Соединим наши ранее объявленные переменный с классом, соответственно здесь присваиваются эти переменные.

В onCreateViewHolder, мы сделаем layout inflator, будем передавать ему данные, укажем что у нас ключевым для вывода данных является row.xml файл, в который будет все значения попадать.

Теперь давайте чтобы меньше было красных подчеркиваний, создадим всё-таки MyViewClass, спустим его ниже, выглядит он будет вот так:

public class MyViewClass extends RecyclerView.ViewHolder{
        TextView name;
        TextView email;
        public MyViewClass(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.name);
            email = itemView.findViewById(R.id.email);
        }
    }

MyViewClass наследуется от recyclerview viewholder объявляем переменные для имя и почты, в принципе это можно уже убрать, как бы понятно и передаем данные в пункт списка.

Нужно будет знать количество записей, сделать это можно чуть выше,

@Override
    public int getItemCount() {
        return name.size();
    }

И ещё нам здесь осталось добавить onBindViewHolder в котором при нажатии на сам список будет появляться всплывающий текст.

Теперь перейдём в файл mainactivity.java, в ней будем работать с json объектами и массивами.

Нужно будет json файл получить в переменную jsonObject. Поскольку у нас ещё не написана JsonDataFromAsset функция, давайте её здесь вставлю, покажу и расскажу как она работает.

Поскольку будем базироваться в следующих видео тоже на похожем коде, то давайте разберемся как работает эта функция.

Мы передаем ей имя нашего json файла здесь у нас возвращается строковое значение, дальше разбор массива произойдет в цикле, try/catch - обработка исключений, здесь мы пробегаем по всему массиву через

getAssets().open(fileName)

открываем его в inputstream входящий поток, определяем размер, создаем массив байтов, передаём этот массив байтов через чтение из inputstream.

Закрываем поток, в переменную json в строковом виде в формате utf-8 наша функция JsonDataFromAsset будет возвращать данные.

Теперь из объекта получаем массив, обратите внимание данную конструкцию нужно обрабатывать через try/catch с исключениями, потому как здесь будет работать ещё цикл.

В цикле for мы будем пробегать по-нашему массиву ну и соответственно

JSONObject userData=jsonArray.getJSONObject(i);

и передадим в name и в email

name.add(userData.getString("name"));
email.add(userData.getString("email"));

наши значения.

Так ну и после мы вызываем

HelperAdapter helperAdapter = new HelperAdapter(name,email,MainActivity.this);

и зададим

recyclerView.setAdapter(helperAdapter);

Перед onCreate зададим два ArrayList

ArrayList< String > name = new ArrayList<>();
ArrayList< String > email = new ArrayList<>();

Как делали это в HelperAdapter.

Ну вот и всё, разбираем файл, передаем в массив, получаем данные. Короче ничего сверхсложного)) Сохраняем проект, запускаем на эмуляторе.

Последние штрихи, исправим высоту

androidx.cardview.widget.CardView

на

android:layout_height="wrap_content"

и LinearLayout

android:layout_height="wrap_content"

и сохранить.

получение JSON в RecyclerView и CardView

Итак мы рассмотрели в двух словах, как работать с локальным json файлом, который находится в папке assets, и вывели данные через recyclerview и cardview.

Существует способ создания json файла, в котором нет имени массива, а сразу идут через запятую блоки данных, и данный код с ним работать не будет.

С каким вариантом будете работать именно вы, решать вам, а в следующей статье и видео и рассмотрим именно этот случай, кроме того использовать будем listview для отображения данных.

В общем, если вы ничего не поняли, то ожидайте выход новых статей и видео и подписывайтесь на канал в YouTube.

Федя, Вася, Юра, Коля – всем привет)

Cкачать архив для ознакомления - Android Studio: получение JSON в RecyclerView и CardView. #1:


ZIP архив с проектом


Полный текст activity_main.xml

< ?xml version="1.0" encoding="utf-8"?>
< RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    < androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerView"/>

< /RelativeLayout>

Полный текст row.xml

<?xml version="1.0" encoding="utf-8"?>
< androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/cardView"
    android:layout_margin="6dp"
    >
    < LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="5dp"
        >
        < TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="name"
            android:textSize="30sp"/>
        < TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="email"
            android:textSize="30sp"/>
    < /LinearLayout>


< /androidx.cardview.widget.CardView>

Полный текст MainActivity.java

package ru.maxfad.loadjsonfromassets_01;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

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

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    ArrayList< String > name = new ArrayList<>();
    ArrayList< String > email = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recyclerView);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(linearLayoutManager);

        try {
            JSONObject jsonObject = new JSONObject(JsonDataFromAsset("users.json"));
            JSONArray jsonArray = jsonObject.getJSONArray("users");
            for (int i=0;i< jsonArray.length();i++){
                JSONObject userData=jsonArray.getJSONObject(i);
                name.add(userData.getString("name"));
                email.add(userData.getString("email"));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        HelperAdapter helperAdapter = new HelperAdapter(name,email,MainActivity.this);
        recyclerView.setAdapter(helperAdapter);
        }

        private String JsonDataFromAsset(String fileName) {
        String json = null;
        try {
            InputStream inputStream = getAssets().open(fileName);
            int sizeOfFile = inputStream.available();
            byte[] bufferData = new byte[sizeOfFile];
            inputStream.read(bufferData);
            inputStream.close();
            json = new String(bufferData, "UTF-8");
        }catch (IOException e){
            e.printStackTrace();
            return null;
        }
        return json;
    }


}

Полный текст HelperAdapter.java

package ru.maxfad.loadjsonfromassets_01;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class HelperAdapter extends RecyclerView.Adapter< HelperAdapter.MyViewClass > {
    ArrayList< String > name;
    ArrayList< String > email;
    Context context;

    public HelperAdapter(ArrayList< String > name, ArrayList< String > email, Context context) {
        this.name = name;
        this.email = email;
        this.context = context;
    }
    @NonNull
    @Override
    public MyViewClass onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row,parent,false);
        MyViewClass myViewClass=new MyViewClass(view);
        return myViewClass;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewClass holder, int position) {
        holder.name.setText(name.get(position));
        holder.email.setText(email.get(position));

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,"Item Clicked",Toast.LENGTH_LONG).show();
            }
        });
    }


    @Override
    public int getItemCount() {
        return name.size();
    }

    public class MyViewClass extends RecyclerView.ViewHolder{
        TextView name;
        TextView email;
        public MyViewClass(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.name);
            email = itemView.findViewById(R.id.email);
        }
    }



}

Смотрите видео: Android Studio: получение JSON в RecyclerView и CardView. Урок № 1.

 С уважением, авторы сайта Компьютерапия




Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

Связанные статьи

Предыдущие статьи

We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience (tracking cookies). You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.

Ok