কম্পিউটার টিউটোরিয়াল

Kotlin ব্যবহার করে Android-এ JSON অবজেক্ট পার্স করা

ওভারভিউ

এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে `org.json` লাইব্রেরি ব্যবহার করে লোকাল অ্যাসেট ফাইল থেকে JSON ডেটা পড়ে RecyclerView-এ দেখানো যায়। আধুনিক অ্যাপগুলোর জন্য Gson, Moshi, বা kotlinx.serialization ব্যবহার করা সুপারিশ করা হয়।

প্রয়োজনীয় ধাপসমূহ

ধাপ ১: নতুন প্রজেক্ট তৈরি

ধাপ ২: 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>

ধাপ ৩: assets/users_list.json ফাইল তৈরি

`src/main/assets/` ডিরেক্টরি তৈরি করে ফাইল রাখুন:

{
  "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" }
    }
  ]
}

ধাপ ৪: MainActivity.kt (org.json ব্যবহার)

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.io.InputStream
import java.nio.charset.StandardCharsets

class MainActivity : AppCompatActivity() {
    private val personName = mutableListOf<String>()
    private val emailId = mutableListOf<String>()
    private val mobileNumbers = mutableListOf<String>()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "JSON Parsing Demo"
        
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)
        
        parseJSON()
        
        val adapter = CustomAdapter(this, personName, emailId, mobileNumbers)
        recyclerView.adapter = adapter
    }
    
    private fun parseJSON() {
        try {
            val jsonString = loadJSONFromAsset()
            val jsonObject = JSONObject(jsonString)
            val userArray = jsonObject.getJSONArray("users")
            
            for (i in 0 until userArray.length()) {
                val user = userArray.getJSONObject(i)
                personName.add(user.getString("name"))
                emailId.add(user.getString("email"))
                
                val contact = user.getJSONObject("contact")
                mobileNumbers.add(contact.getString("mobile"))
            }
        } catch (e: JSONException) {
            e.printStackTrace()
        }
    }
    
    private fun loadJSONFromAsset(): String {
        return try {
            val inputStream: InputStream = assets.open("users_list.json")
            val size = inputStream.available()
            val buffer = ByteArray(size)
            inputStream.read(buffer)
            inputStream.close()
            String(buffer, StandardCharsets.UTF_8)
        } catch (ex: IOException) {
            ex.printStackTrace()
            ""
        }
    }
}

ধাপ ৫: CustomAdapter.kt

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

class CustomAdapter(
    private val context: Context,
    private val personNames: List<String>,
    private val emailIds: List<String>,
    private val mobileNumbers: List<String>
) : RecyclerView.Adapter<CustomAdapter.MyViewHolder>() {
    
    class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val name: TextView = view.findViewById(R.id.tvName)
        val email: TextView = view.findViewById(R.id.tvEmail)
        val mobileNo: TextView = view.findViewById(R.id.tvMobile)
    }
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.rowlayout, parent, false)
        return MyViewHolder(view)
    }
    
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.name.text = personNames[position]
        holder.email.text = emailIds[position]
        holder.mobileNo.text = mobileNumbers[position]
        
        holder.itemView.setOnClickListener {
            Toast.makeText(context, personNames[position], Toast.LENGTH_SHORT).show()
        }
    }
    
    override fun getItemCount() = personNames.size
}

ধাপ ৬: rowlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.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_height="wrap_content"
    android:layout_margin="8dp"
    card_view:cardCornerRadius="8dp"
    card_view:cardElevation="4dp">
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp">
        
        <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Name"
            android:textColor="#000"
            android:textSize="20sp"
            android:textStyle="bold" />
        
        <TextView
            android:id="@+id/tvEmail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="4dp"
            android:text="email@email.com"
            android:textColor="#666"
            android:textSize="15sp" />
        
        <TextView
            android:id="@+id/tvMobile"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="4dp"
            android:text="Mobile"
            android:textColor="#666"
            android:textSize="15sp" />
    </LinearLayout>
</androidx.cardview.widget.CardView>

🚀 আধুনিক এবং ভালো পদ্ধতি: kotlinx.serialization / Moshi / Gson

1. kotlinx.serialization (Kotlin অফিশিয়াল, কটলিন-ফার্স্ট)

build.gradle.kts:

plugins {
    id("org.jetbrains.kotlin.plugin.serialization") version "1.9.0"
}
dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
}

ডেটা ক্লাস:

@Serializable
data class UserResponse(val users: List<User>)

@Serializable
data class User(
    val name: String,
    val email: String,
    val contact: Contact
)

@Serializable
data class Contact(val mobile: String)

পার্সিং:

import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json

val json = Json { ignoreUnknownKeys = true }
val response = json.decodeFromString(jsonString)
// response.users লিস্ট রেডি!

2. Moshi (Square, রিফ্লেকশন-ফ্রি, ফাস্ট)

implementation("com.squareup.moshi:moshi:1.15.1")
implementation("com.squareup.moshi:moshi-kotlin:1.15.1")
kapt("com.squareup.moshi:moshi-kotlin-codegen:1.15.1")

// ব্যবহার
val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val adapter = moshi.adapter(UserResponse::class.java)
val response = adapter.fromJson(jsonString)

3. Gson (Google, জনপ্রিয়)

implementation("com.google.code.gson:gson:2.10.1")

val gson = Gson()
val response = gson.fromJson(jsonString, UserResponse::class.java)

তুলনা

লাইব্রেরিস্পিডকোটলিন সাপোর্টরিফ্লেকশনকোড জেনারেশন
org.jsonধীরনहींহ্যাঁনা
Gsonমাঝারিভালোহ্যাঁ (ডিফল্ট)না
Moshiদ্রুতঅসাধারণনা (কোডজেন)হ্যাঁ (kapt)
kotlinx.serializationদ্রুততমনেটিভনাহ্যাঁ (কম্পাইলার প্লাগইন)

সেরা অনুশীলন

  1. নেটওয়ার্ক কলের জন্য Retrofit + Moshi/kserialization ব্যবহার করুন
  2. @SerialName এনটেশন দিয়ে JSON কী ম্যাপ করুন (snake_case ↔ camelCase)
  3. ignoreUnknownKeys = true রাখুন ভবিষ্যত-প্রুফ করার জন্য
  4. Sealed Class ব্যবহার করে পলিমরফিক JSON হ্যান্ডল করুন
  5. বড় JSON-র জন্য Streaming parser (Moshi/Gson streaming) ব্যবহার করুন
  1. অ্যান্ড্রয়েডে JSONObject ব্যবহার করে JSON পার্স করা

  2. অ্যান্ড্রয়েডে JSON অবজেক্ট পার্স করার পদ্ধতি

  3. অ্যান্ড্রয়েডে JSON পার্স করার সহজ পদ্ধতি

  4. অ্যান্ড্রয়েডে HTML পার্স করার পদ্ধতি (Jsoup লাইব্রেরি ব্যবহার করে)