AndroidでJSONオブジェクトを解析する方法!RecyclerViewで一覧表示する完全ガイド
AndroidでJSONオブジェクトを解析する方法
この記事では、AndroidアプリでJSONオブジェクトを解析(パース)し、取得したデータをRecyclerViewに一覧表示する方法を、ステップごとにわかりやすく解説します。アセットフォルダに配置したJSONファイルを読み込み、名前・メールアドレス・電話番号の情報を取り出して画面に表示するまでの一連の流れを学べるので、Android開発初心者の方にもおすすめの内容です。
手順1:新規プロジェクトを作成する
まず、Android Studioを起動し、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目をすべて入力して、プロジェクトを完成させましょう。
手順2:build.gradleに依存関係を追加する
次に、「Gradle Scripts」→「build.gradle」を開き、以下の依存関係を追加してSync(同期)を実行します。このサンプルではRecyclerViewとCardViewを使用するため、それぞれのライブラリをdependenciesブロックに追記しています。
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.sample"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation "com.android.support:recyclerview-v7:23.0.1" // RecyclerView用の依存ファイル
implementation 'com.android.support:cardview-v7:23.0.1' // CardView用の依存ファイル
}
手順3:activity_main.xmlにレイアウトを追加する
「res/layout/activity_main.xml」に以下のコードを記述します。画面全体にRecyclerViewを配置し、後ほど作成するアダプターでリストを表示できるようにします。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
手順4:rowlayout_main.xmlを作成する
続いて、「res/layout/rowlayout_main.xml」に以下のコードを記述します。RecyclerViewの各行のレイアウトにはCardViewを使用し、名前・メールアドレス・電話番号を表示する3つのTextViewを縦方向に並べています。
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:card_view="https://schemas.android.com/apk/res-auto"
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_margin="5dp"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<!--RecyclerViewの1行分のアイテム-->
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name"
android:textColor="#000"
android:textSize="20sp" />
<TextView
android:id="@+id/tvEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="email@email.com"
android:textColor="#000"
android:textSize="15sp" />
<TextView
android:id="@+id/tvMobile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="e9999999999"
android:textColor="#000"
android:textSize="15sp" />
</LinearLayout>
</android.support.v7.widget.CardView>
手順5:MainActivity.javaを実装する
「src/MainActivity.java」に以下のコードを記述します。アセットフォルダからJSONファイルを読み込み、JSONObjectとJSONArrayを使ってデータを解析します。取得した名前・メールアドレス・電話番号はそれぞれArrayListに格納し、CustomAdapterに渡してRecyclerViewに表示します。
package com.example.sample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
// 氏名・メールアドレス・電話番号を保持するArrayList
ArrayList<String> personNames=new ArrayList<>();
ArrayList<String> emailIds=new ArrayList<>();
ArrayList<String> mobileNumbers=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// RecyclerViewの参照を取得
RecyclerView recyclerView=(RecyclerView) findViewById(R.id.recyclerView);
// デフォルトの縦方向でLinearLayoutManagerを設定
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(linearLayoutManager);
try {
// JSONファイルからJSONObjectを取得
JSONObject obj=new JSONObject(loadJSONFromAsset());
// "users"という名前のJSONArrayを取得
JSONArray userArray=obj.getJSONArray("users");
// forループでユーザーリストのデータを取得
for (int i = 0; i < userArray.length(); i++) {
// 1人分のユーザーデータを取得するためのJSONObjectを作成
JSONObject userDetail=userArray.getJSONObject(i);
// メールアドレスと氏名を取得してArrayListに保存
personNames.add(userDetail.getString("name"));
emailIds.add(userDetail.getString("email"));
// 連絡先データを取得するためのJSONObjectを作成
JSONObject contact=userDetail.getJSONObject("contact");
// 電話番号を取得してArrayListに保存
mobileNumbers.add(contact.getString("mobile"));
}
} catch (JSONException e) {
e.printStackTrace();
}
// CustomAdapterのコンストラクタを呼び出し、参照とデータを渡す
CustomAdapter customAdapter=new CustomAdapter(MainActivity.this, personNames, emailIds, mobileNumbers);
recyclerView.setAdapter(customAdapter); // RecyclerViewにアダプターを設定
}
public String loadJSONFromAsset() {
String json=null;
try {
InputStream is=getAssets().open("users_list.json");
int size=is.available();
byte[] buffer=new byte[size];
is.read(buffer);
is.close();
json=new String(buffer, "UTF-8");
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
return json;
}
}
users_list.jsonファイルを作成しよう
上記のコードでは、アセットフォルダ内の「users_list.json」というファイルを読み込んでいます。「app」フォルダを右クリック→「New」→「Folder」→「Assets Folder」でassetsフォルダを作成し、以下のような構造のJSONファイルを配置してください。ネストされた「contact」オブジェクトの中に「mobile」キーがある点がポイントです。
{
"users": [
{
"name": "山田太郎",
"email": "taro@example.com",
"contact": {
"mobile": "09012345678"
}
},
{
"name": "鈴木花子",
"email": "hanako@example.com",
"contact": {
"mobile": "08087654321"
}
}
]
}
手順6:CustomAdapter.javaを実装する
「src/CustomAdapter.java」に以下のコードを記述します。RecyclerView.Adapterを継承したカスタムアダプターを作成し、onBindViewHolderで各行にデータをバインドします。また、アイテムをタップすると、その人の名前がToastで表示されるようにクリックイベントも実装しています。
package com.example.sample;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
ArrayList<String> personNames;
ArrayList<String> emailIds;
ArrayList<String> mobileNumbers;
Context context;
public CustomAdapter(Context context, ArrayList<String> personNames, ArrayList<String> emailIds, ArrayList<String> mobileNumbers) {
this.context=context;
this.personNames=personNames;
this.emailIds=emailIds;
this.mobileNumbers=mobileNumbers;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// アイテムのレイアウトをインフレート
View v=LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false);
MyViewHolder vh=new MyViewHolder(v); // ビューをViewHolderに渡す
return vh;
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
// アイテムにデータを設定
holder.name.setText(personNames.get(position));
holder.email.setText(emailIds.get(position));
holder.mobileNo.setText(mobileNumbers.get(position));
// アイテムビューにクリックイベントを設定
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// アイテムクリック時に氏名をToastで表示
Toast.makeText(context, personNames.get(position), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return personNames.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView name, email, mobileNo; // アイテムビューの初期化
public MyViewHolder(View itemView) {
super(itemView);
// アイテムビューの参照を取得
name=(TextView) itemView.findViewById(R.id.tvName);
email=(TextView) itemView.findViewById(R.id.tvEmail);
mobileNo=(TextView) itemView.findViewById(R.id.tvMobile);
}
}
}
手順7:AndroidManifest.xmlを確認する
最後に、「app/manifests/AndroidManifest.xml」に以下のコードを記述します。MainActivityがランチャーアクティビティとして登録されていることを確認しましょう。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.sample" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
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>
アプリを実行してみよう
それでは、実際にアプリケーションを実行してみましょう。ここでは、Android端末をパソコンに接続しているものとして説明します。Android Studioからアプリを実行するには、プロジェクト内のアクティビティファイルをいずれか開き、ツールバーの「Run」アイコンをクリックします。実行デバイスとして自分のモバイル端末を選択すると、端末の画面に以下のようにJSONから取得したユーザー情報の一覧がカード形式で表示されます。各アイテムをタップすると、その人の名前がToastで表示されることも確認してみてください。

-
【Android開発】Volleyライブラリを使ってJSONを解析する方法をステップ解説
Volleyライブラリとは この記事では、AndroidアプリでVolleyライブラリを使用してJSONデータを解析(パース)する方法を、ステップごとにわかりやすく解説します。VolleyはGoogleが提供するHTTP通信ライブラリで、ネットワークリクエストの管理やJSONの取得・解析を少ないコード量で実現できるのが特徴です。 ステップ1:新規プロジェクトの作成 まず、Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目をすべて入力してプロジェクトを生成してください。 ステップ2:レイアウトファイル(act
-
AndroidでJSON配列を反復処理する方法をステップごとに解説
この記事では、Androidアプリ開発においてJSON配列(JSONArray)を反復処理する方法を、実際のサンプルコードとともにステップ形式で解説します。org.jsonパッケージのJSONObjectとJSONArrayクラスを使用して、JSON文字列からデータを取り出し、画面に表示するまでの一連の流れを学べます。完成イメージ本チュートリアルでは、従業員情報(ID・名前・給与)を含むJSON文字列を解析し、各要素を順番に読み取ってTextViewに表示するシンプルなアプリを作成します。手順1:Android Studioで新規プロジェクトを作成するまず、Android Studioを起動し