ওভারভিউ
এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে `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 | দ্রুততম | নেটিভ | না | হ্যাঁ (কম্পাইলার প্লাগইন) |
সেরা অনুশীলন
- নেটওয়ার্ক কলের জন্য Retrofit + Moshi/kserialization ব্যবহার করুন
- @SerialName এনটেশন দিয়ে JSON কী ম্যাপ করুন (snake_case ↔ camelCase)
- ignoreUnknownKeys = true রাখুন ভবিষ্যত-প্রুফ করার জন্য
- Sealed Class ব্যবহার করে পলিমরফিক JSON হ্যান্ডল করুন
- বড় JSON-র জন্য Streaming parser (Moshi/Gson streaming) ব্যবহার করুন