Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드에서 JSON 객체를 파싱하는 방법 — 단계별 완벽 가이드

개요

이 예제는 안드로이드(Android)에서 JSON 객체를 파싱하는 방법을 단계별로 소개합니다. 앱의 assets 폴더에 저장된 JSON 파일을 읽어 사용자 목록(이름, 이메일, 전화번호)을 추출한 뒤, RecyclerViewCardView를 활용해 카드 형태의 리스트로 화면에 표시하는 전체 과정을 다룹니다.

1단계 — 새 프로젝트 생성

Android Studio에서 File ⇒ New Project 메뉴로 이동한 후, 새 프로젝트를 만드는 데 필요한 모든 세부 정보를 입력하여 프로젝트를 생성합니다.

2단계 — Gradle 의존성 추가

Gradle Scripts ⇒ build.gradle 파일에 아래 의존성을 추가한 뒤 프로젝트를 동기화(Sync)합니다. RecyclerView와 CardView를 사용하기 위한 라이브러리가 포함되어 있습니다.

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 레이아웃을 추가합니다. 하나의 행에는 이름, 이메일, 전화번호를 표시하는 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 한 행에 표시될 항목들-->
        <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 파일에 아래 코드를 추가합니다. 여기서는 assets 폴더의 JSON 파일을 문자열로 읽어온 뒤, JSONObjectJSONArray를 사용해 각 사용자의 이름·이메일·전화번호를 ArrayList에 저장합니다.

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++) {
                // 개별 사용자 데이터를 위한 JSONObject 생성
                JSONObject userDetail=userArray.getJSONObject(i);
                // 이름과 이메일을 가져와 ArrayList에 저장
                personNames.add(userDetail.getString("name"));
                emailIds.add(userDetail.getString("email"));
                // contact 데이터를 가져오기 위한 객체 생성
                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;
    }
}

6단계 — CustomAdapter.java 작성

src/CustomAdapter.java 파일에 RecyclerView 어댑터 클래스를 추가합니다. 어댑터는 각 행에 데이터를 바인딩하며, 항목을 클릭하면 해당 사용자의 이름을 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 파일에 아래 코드를 추가합니다.

<?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 Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run(실행) 아이콘을 클릭하세요. 실행 옵션에서 자신의 모바일 기기를 선택하면, 기기 화면에 다음과 같은 기본 화면이 표시됩니다.

안드로이드에서 JSON 객체를 파싱하는 방법 — 단계별 완벽 가이드