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

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

이 글에서는 Kotlin을 사용하여 안드로이드에서 JSON 객체를 파싱하는 방법을 단계별로 소개합니다. 에셋(assets) 폴더에 저장된 JSON 파일을 읽어 들여 사용자 정보(이름, 이메일, 연락처)를 추출한 뒤, RecyclerView 목록으로 화면에 표시하는 실전 예제를 함께 다룹니다.

1단계 — 새 프로젝트 생성

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

2단계 — 메인 레이아웃 작성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

3단계 — JSON 파일 준비

새 asset 폴더를 생성한 후, 그 안에 users_list.json 파일을 만들고 아래 내용을 작성합니다. 사용자 배열 안에 contact라는 중첩된 JSON 객체가 포함된 구조이므로, 이후 파싱 과정에서 이 부분에 유의해야 합니다.

{
    "users":[
        {
            "name":"Niyaz",
            "email":"testemail1@gmail.com",
            "contact":{
                "mobile":"+91 0000000000"
            }
        },
        {
            "name":"Azhar",
            "email":"testemail2@gmail.com",
            "contact":{
                "mobile":"+91 0000000000"
            }
        },
        {
            "name":"Mahi",
            "email":"testemail3@gmail.com",
            "contact":{
                "mobile":"+91 0000000000"
            }
        }
    ]
}

4단계 — MainActivity.kt 작성

src/MainActivity.kt에 아래 코드를 추가합니다. loadJSONFromAsset() 함수가 에셋 폴더의 JSON 파일을 문자열로 읽어 오며, JSONObject와 JSONArray를 이용해 각 사용자의 이름·이메일·휴대폰 번호를 리스트에 차례로 저장합니다.

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import org.json.JSONException
import org.json.JSONObject
import java.io.IOException
import java.nio.charset.Charset
class MainActivity : AppCompatActivity() {
    var personName: ArrayList<String> = ArrayList()
    var emailId: ArrayList<String> = ArrayList()
    var mobileNumbers: ArrayList<String> = ArrayList()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        val linearLayoutManager = LinearLayoutManager(applicationContext)
        recyclerView.layoutManager = linearLayoutManager
        try {
            val obj = JSONObject(loadJSONFromAsset())
            val userArray = obj.getJSONArray("users")
            for (i in 0 until userArray.length()) {
                val userDetail = userArray.getJSONObject(i)
                personName.add(userDetail.getString("name"))
                emailId.add(userDetail.getString("email"))
                val contact = userDetail.getJSONObject("contact")
                mobileNumbers.add(contact.getString("mobile"))
            }
        }
        catch (e: JSONException) {
            e.printStackTrace()
        }
        val customAdapter = CustomAdapter(this@MainActivity, personName, emailId, mobileNumbers)
        recyclerView.adapter = customAdapter
    }
    private fun loadJSONFromAsset(): String {
        val json: String?
        try {
            val inputStream = assets.open("users_list.json")
            val size = inputStream.available()
            val buffer = ByteArray(size)
            val charset: Charset = Charsets.UTF_8
            inputStream.read(buffer)
            inputStream.close()
            json = String(buffer, charset)
        }
        catch (ex: IOException) {
            ex.printStackTrace()
            return ""
        }
        return json
    }
}

5단계 — CustomAdapter.kt 작성

새 클래스 CustomAdapter.kt를 만들고 아래 코드를 추가합니다. 어댑터는 각 항목에 데이터를 바인딩하며, 항목을 클릭하면 해당 사용자의 이름을 토스트(Toast)로 표시합니다.

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.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import java.util.*
class CustomAdapter(
    private var context: Context,
    private var personNames: ArrayList<String>,
    private var emailIds: ArrayList<String>,
    private var mobileNumbers: ArrayList<String>
) :
RecyclerView.Adapter<CustomAdapter.MyViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.rowlayout, parent, false)
        return MyViewHolder(v)
    }
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        // set the data in items
        holder.name.text = personNames[position]
        holder.email.text = emailIds[position]
        holder.mobileNo.text = mobileNumbers[position]
        // implement setOnClickListener event on item view.
        holder.itemView.setOnClickListener { // display a toast with person name on item click
            Toast.makeText(context, personNames[position], Toast.LENGTH_SHORT).show()
        }
    }
    override fun getItemCount(): Int {
        return personNames.size
    }
    inner class MyViewHolder(itemView: View) : ViewHolder(itemView) {
        var name: TextView = itemView.findViewById<View>(R.id.tvName) as TextView
        var email: TextView = itemView.findViewById<View>(R.id.tvEmail) as TextView
        var mobileNo: TextView = itemView.findViewById<View>(R.id.tvMobile) as TextView
    }
}

6단계 — 리스트 항목 레이아웃 작성

레이아웃 리소스 파일 rowlayout.xml을 생성하고 아래 코드를 추가합니다. CardView 안에 이름, 이메일, 휴대폰 번호를 표시하는 TextView 세 개가 세로로 배치되어 RecyclerView의 한 행을 구성합니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="https://schemas.android.com/apk/res/android"
    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">
        <!--items for a single row of 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>
</androidx.cardview.widget.CardView>

7단계 — 매니페스트 설정

AndroidManifest.xml에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.q11">
    <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 아이콘 Kotlin으로 안드로이드에서 JSON 객체 파싱하는 방법 — 단계별 완벽 가이드을 클릭합니다. 실행 옵션에서 본인의 모바일 기기를 선택하면, 기기 화면에 JSON에서 파싱된 사용자 목록이 아래와 같이 표시됩니다.

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