Moshi: بنیادی مفاہیم، Kotlin کے لیے JSON لائبریری اور یہ کیسے کام کرتی ہے

مصنف: IT Sectr اشاعت: 2026-03-15 مطالعے کا وقت: 8 منٹ

Moshi Square کی ایک جدید JSON لائبریری ہے، جو Gson کی محدودیتوں کو مدنظر رکھتے ہوئے خاص طور پر Kotlin اور Android کے لیے تیار کی گئی ہے۔ یہ Kotlin کی null حفاظت کے ساتھ مکمل طور پر مطابق ہے، ترتیب کے وقت کوڈ تیار کرتی ہے اور عکس کا استعمال نہیں کرتی، جو کارکردگی اور بھروسگی کو بہتر بناتا ہے۔ Square Moshi, 2024 کے مطابق، Moshi قابل پیش گوئی سیریالائزیشن فراہم کرتی ہے اور کسی بھی قسم کے ڈیٹا کے لیے کسٹم ایڈاپٹر کی حمایت کرتی ہے۔

اہم نکات

  • Moshi « Square کی Kotlin اور Android کے لیے بغیر عکس کے JSON لائبریری
  • Kotlin ایڈاپٹر « data class، کا استعمال کریں اور غیر موجودگی کی حفاظت کے لیے مضمونی حمایت
  • @Json « فیلڈ کا نام ترتیب دینے اور خواص کو نظر انداز کرنے کے لیے اینوٹیشن
  • ایڈاپٹر « @ToJson اور @FromJson کے ذریعے کسٹم سیریالائزیشن لاجک
  • کوڈ جینریشن « Moshi kapt یا KSP کے ذریعے ترتیب کے وقت پر ایڈاپٹر تیار کرتی ہے

Moshi کیا ہے

Moshi JVM، Android اور Kotlin Multiplatform کے لیے ایک JSON لائبریری ہے، جو Square (OkHttp اور Retrofit کے مصنفین) نے تیار کی ہے۔ Gson کے برعکس، Moshi عکس پر انحصار نہیں کرتی « @JsonClass(generateAdapter = true) اینوٹیشن کے ذریعے ایڈاپٹر ترتیب کے وقت پر تیار ہوتے ہیں۔ یہ Moshi کو Kotlin کے مخصوص کلیس کے ساتھ کام کرتے وقت تیز، محفوظ اور زیادہ قابل پیش گوئی بناتا ہے۔

فلسفہ اور فوائد

Moshi اور اس کے پیشرو کے درمیان بنیادی فرق عکس کو مسترد کرنا ہے۔ عکس Gson کو تیاری کے بغیر کسی بھی کلاس کے ساتھ کام کرنے کی اجازت دیتا ہے، لیکن اس کی قیمت سسٹم کی سست ابتدائیی، مرتب کرنے والے کی طرف سے بہترین کرنے کی ناقابلیت اور ران ٹائم خرابیوں کا خطرہ ہے۔ Moshi کو کوڈ جینریشن کے لیے کلاس کے واضح اعلان کی ضرورت ہے، لیکن اس کے بدلے میں ہاتھ سے لکھے کوڈ کی بہترین کارکردگی اور ترتیب کے وقت پر مکمل ٹائپ حفاظت فراہم کرتی ہے۔

kotlin
// build.gradle میں Moshi شامل کریں
dependencies {
    implementation "com.squareup.moshi:moshi:1.15.0"
    implementation "com.squareup.moshi:moshi-kotlin:1.15.0"
    kapt "com.squareup.moshi:moshi-kotlin-codegen:1.15.0"
}

// کوڈ جینریشن کے ساتھ سادہ ماڈل
@JsonClass(generateAdapter = true)
data class User(
    @Json(name = "user_id")
    val id: Int,
    val name: String,
    val email: String,
    val avatar: String? = null
)

// استعمال
val moshi = Moshi.Builder()
    .build()
val jsonAdapter = moshi.adapter(User::class.java)

انسٹالیشن اور ترتیب

Moshi کے ساتھ کام شروع کرنے کے لیے، build.gradle میں انحصارات شامل کرنے اور ماڈل کو اینوٹیٹ کرنے کی ضرورت ہے۔ Moshi.Builder داخلی مقام کے طور پر کام کرتا ہے: اس کے ذریعے معیاری اقسام کے لیے مضمونی ایڈاپٹر، کسٹم ایڈاپٹر شامل کیے جاتے ہیں اور لائبریری کا رویہ ترتیب دیا جاتا ہے۔ Moshi Date، Enum، Collection اور Map کے لیے ایڈاپٹر کو باہر کے بکس میں سپورٹ کرتی ہے، لیکن Kotlin کلاس کے لیے moshi-kotlin ماڈیول کی ضرورت ہے۔ Gson کے برعکس، Moshi طرح کے مطابق Kotlin کلاس کے لیے عکس کا استعمال نہیں کرتی « اس کے لیے KotlinJsonAdapterFactory منسلک ہوتا ہے، جو بیک اپ کے طور پر کام کرتا ہے جب کوڈ جینریشن استعمال نہیں کیا جاتا یا کلاس @JsonClass سے اینوٹیٹ نہیں ہوتی۔ یہ طریقہ اس بات کی ضمانت دیتا ہے کہ ڈیویلپر ہر مخصوص کلاس کے لیے کوڈ جینریشن کی کارکردگی اور عکس کی لچیلیپی کے درمیان واضح طور پر انتخاب کرتا ہے۔

Moshi بنانا اور ایڈاپٹر شامل کرنا

Builder کے ذریعے Moshi تیار کرنے کے بعد، ڈیویلپر کو Moshi کا ایک مثال ملتا ہے اور مطلوبہ کلاس کے لیے ایک ایڈاپٹر کی درخواست کرتا ہے۔ JsonAdapter مرکزی آبجیکٹ ہے جو toJson() کے ذریعے سیریالائزیشن اور fromJson() کے ذریعے ڈی سیریالائزیشن انجام دیتا ہے۔ اگر کلاس @JsonClass(generateAdapter = true) سے اینوٹیٹ ہے تو Moshi خودکار طور پر تیار کردہ ایڈاپٹر استعمال کرتی ہے، ورنہ بیک اپ کے طور پر عکسی KotlinJsonAdapterFactory لاغو کرتی ہے۔ یہ طریقہ کسی بھی پیمانے اور پیچیدگی کے مناصب کے لیے کوڈ جینریشن کی بہترین کارکردگی کو عکسی میکانزم کی لچیلیپی کے ساتھ جوڑتا ہے۔ Moshi چھوٹے ایپلیکیشنز اور سو ایپلیکیشنز سے لے کر سیکڑوں ڈیٹا ماڈل کے ساتھ بڑے کارپوریٹ مناصب کے لیے بھی موزوں ہے۔

kotlin
// KotlinJsonAdapterFactory کے ساتھ Moshi ترتیب دیں
val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .add(LocalDateAdapter())
    .build()

// ایڈاپٹر کا استعمال
val adapter = moshi.adapter(User::class.java)

// سیریالائزیشن
val user = User(1, "Alice", "alice@test.com")
val json = adapter.toJson(user)

// ڈی سیریالائزیشن
val jsonString = """{"user_id":2,"name":"Bob","email":"bob@test.com"}"""
val parsedUser = adapter.fromJson(jsonString)

// فہرست کے ساتھ کام
val listAdapter = moshi.adapter(
    Types.newParameterizedType(
        List::class.java,
        User::class.java
    )
)

اینوٹیشنز اور ایڈاپٹر

Moshi سیریالائزیشن ترتیب دینے اور کسٹم اقسام کی حمایت کے لیے اینوٹیشنز استعمال کرتی ہے۔ @Json(name = "...") ایک فیلڈ کے لیے JSON کنجی مقرر کرتا ہے۔ @Transient ایک فیلڈ کو سیریالائزیشن سے خارج کر دیتا ہے۔ @JsonClass(generateAdapter = true) کوڈ جینریشن کو چالو کرتا ہے۔ کسٹم لاجک کے لیے، Moshi @ToJson اور @FromJson اینوٹیشنز فراہم کرتی ہے، جنہیں ایک علاحدہ ایڈاپٹر کلاس میں رکھا جا سکتا ہے۔

@Json اور کسٹم ایڈاپٹر

@Json اینوٹیشن Gson کے @SerializedName کو بدلتا ہے اور اسی طرح کام کرتا ہے: kotlinName فیلڈ "kotlin_name" JSON کنجی سے منسلک ہوتا ہے۔ ان اقسام کے لیے جنہیں Moshi طرح کے مطابق سیریالائز نہیں کر سکتی (مثال کے طور پر LocalDate)، ڈیویلپر @ToJson اور @FromJson میتھڈز کے ساتھ ایک کلاس بناتا ہے۔ ایڈاپٹر Moshi.Builder.add() کے ذریعے رجسٹر ہوتے ہیں اور عالمی طور پر یا کسی مخصوص قسم پر لاغو ہوتے ہیں۔ Moshi سیل کلاس اور @JsonClass کے ذریعے واضح امتیاز کنندہ کے ساتھ پولی مارفک سیریالائزیشن کی حمایت کرتی ہے، جو دستی فیلڈ جانچ کے بغیر JSON میں قسم کے درجہ بندی کے ساتھ کام کرنے کی اجازت دیتا ہے۔ ڈی سیریالائزیشن کے دوران، Moshi طرح کے مطابق ناشناسہ JSON کنجیوں کو نظر انداز کرتی ہے، کلائنٹ کوڈ کو بدلے بغیر سرور کی جانب نئے فیلڈ شامل کرتے وقت پشت کناتی مطابقت کی ضمانت دیتی ہے۔ ڈبگنگ کے لیے، failOnUnknown کے ذریعے سخت موڈ چالو کیا جا سکتا ہے، جو ناشناسہ کنجیاں ملنے پر استثنا پھینکتا ہے۔

kotlin
// LocalDate کے لیے کسٹم ایڈاپٹر
class LocalDateAdapter {

    @ToJson
    fun toJson(date: LocalDate): String {
        return date.format(DateTimeFormatter.ISO_LOCAL_DATE)
    }

    @FromJson
    fun fromJson(dateString: String): LocalDate {
        return LocalDate.parse(dateString)
    }
}

// Moshi اینوٹیشنز کے ساتھ ماڈل
@JsonClass(generateAdapter = true)
data class Event(
    @Json(name = "event_id")
    val id: Int,

    @Json(name = "event_date")
    val date: LocalDate,

    @Transient
    val localCache: String? = null
)

// ایڈاپٹر رجسٹر کریں
val moshi = Moshi.Builder()
    .add(LocalDateAdapter())
    .add(KotlinJsonAdapterFactory())
    .build()

Moshi بنام Gson

Moshi اور Gson کا موازنہ ایک Android منصوبے کے لیے JSON لائبریری چینتی کرتے وقت ایک عام سوال ہے۔ Moshi کوڈ جینریشن، ناموجودگی کی حفاظت اور بہترین کارکردگی کے لیے جدید Kotlin ڈیویلپمنٹ میں کامیاب ہے۔ Gson Java مناصب، لیگسی کوڈ اور ایسے مناظر کے لیے موزوں رہتا ہے جہاں کم سے کم ترتیب اہم ہے۔ فرق بڑے ڈیٹا حجم اور پیچیدہ ماڈل کے ساتھ نمایاں ہو جاتا ہے۔

کارکردگی اور حفاظت

کارکردگی کے ٹیسٹ ظاہر کرتے ہیں کہ کوڈ جینریشن کے ساتھ Moshi سیریالائزیشن اور ڈی سیریالائزیشن کے کاموں میں Gson سے 2–5 گنا تیز ہے۔ Moshi کا بنیادی فائدہ Kotlin کی ناموجودگی کی حفاظت کا درست ہینڈلنگ ہے: اگر JSON میں کوئی فیلڈ غائب ہے اور ماڈل اسے معیاری قیمت کے بغیر non-null کے طور پر مقرر کرتا ہے، Moshi ڈی سیریالائزیشن کے وقت استثنا پھینک دیتی ہے، چھپے ہوئے نقاط کو روکتی ہے۔

خصوصیاتGsonMoshi
میکانزمعکسکوڈ جینریشن / عکس
ناموجودگی حفاظتغیر موجودگی کو نہیں مانتامکمل Kotlin حمایت
بہترین کارکردگیدرمیانہاعلیٰ
معیاری قیمتیںحمایت نہیں کرتاحمایت کرتا ہے
Kotlin Multiplatformنہیںہاں
لائبریری کا حجم~240 Kb~150 Kb

Moshi اور Gson کے درمیان انتخاب منصوبے کے سیاق پر منحصر ہے۔ Kotlin پر نئے مناصب ٹائپ حفاظت اور کارکردگی کے لیے Moshi سے فائدہ اٹھاتے ہیں۔ Gson Java کوڈ کی حمایت، متغیر JSON ساخت، یا ایسے مناظر کے لیے ایک مناسب متخذ ہے جہاں ترتیب کی سادگی بہترین کارکردگی سے زیادہ اہم ہے۔ Kotlin Multiplatform کے لیے، Moshi اس پلیٹ فارم کی حمایت کرنے والا دونوں میں سے واحد اکیلا اختیار ہے۔

Gson سے Moshi میں منتقل ہوتے وقت، اہم تبدیلیاں اینوٹیشنز اور ایڈاپٹروں سے متعلق ہیں۔ Gson کا @SerializedName @Json(name = "...") سے بدل دیا جاتا ہے، اور کسٹم JsonSerializer/JsonDeserializer کو @ToJson/@FromJson جوڑے سے بدل دیا جاتا ہے۔ معیاری قیمتوں اور nullable فیلڈز والے ماڈل کے لیے، Moshi زیادہ قابل پیش گوئی سے کام کرتی ہے: اگر JSON میں معیاری قیمت کے بغیر ایک non-null فیلڈ غائب ہے، Moshi JsonDataException پھینکتی ہے، چھپے NPE کو روکتی ہے۔ MoshiConverterFactory کے ذریعے Retrofit کے ساتھ انضمام ایک واحد انحصار سے ہوتا ہے اور نیٹ ورک پرت کے آرکیٹیکچر کو بدلنے کی ضرورت نہیں ہے۔ ProGuard یا R8 کے ذریعے مبہم کرنے کے لیے، @JsonClass سے اینوٹیٹ کردہ کلاسوں اور تیار کردہ ایڈاپٹروں کو محفوظ رکھنے کے قوانین شامل کرنے ضروری ہیں، ورنہ ریلیز بائلڈ میں سیریالائزیشن ٹوٹ جائے گی۔ مجموعی طور پر، Gson سے Moshi میں منتقل ہونا نئے Kotlin مناصب میں جائز ہے جہاں کارکردگی اور ٹائپ حفاظت اہم ہے۔

kotlin
// سیریالائزیشن موازنہ: Gson بنام Moshi
data class Sample(
    val name: String,
    val count: Int,
    val tags: List<String> = listOf()
)

// Gson: عکس کے ذریعے کام کرتا ہے
val gson = Gson()
val fromGson = gson.fromJson("""{"name":"test"}""",
    Sample::class.java)
// count = 0 (معیاری)، لیکن غیر موجودگی کی حفاظت تسل نہیں کی جاتی

// Moshi: ایڈاپٹر کی ضرورت ہے، غیر موجودگی کی حفاظت واضح ہے
@JsonClass(generateAdapter = true)
data class SampleMoshi(
    val name: String,
    val count: Int,
    val tags: List<String> = listOf()
)

اکثر پوچھے جانے والے سوالات

Android میں Moshi کیا ہے؟

Moshi Square کی Kotlin اور Android کے لیے ایک JSON لائبریری ہے جو عکس کے بجائے کوڈ جینریشن استعمال کرتی ہے۔ یہ اعلیٰ کارکردگی، Kotlin کی غیر موجودگی کی حفاظت کا درست ہینڈلنگ اور Kotlin Multiplatform کے ساتھ مطابقت فراہم کرتی ہے۔

Moshi Gson سے بہتر کیسے ہے؟

Moshi بہترین کارکردگی (کوڈ جینریشن کے بائس 2–5 گنا تیز)، حفاظت (Kotlin null اینوٹیشنز کو مانتی ہے) اور حجم (~90 Kb چھوٹا) میں Gson سے بہتر ہے۔ Moshi Kotlin Multiplatform اور data class میں معیاری قیمتوں کو بھی سپورٹ کرتی ہے۔

Moshi میں @JsonClass اینوٹیشن کیسے کام کرتا ہے؟

@JsonClass(generateAdapter = true) Moshi کو ہدایت دیتا ہے کہ دی گئی کلاس کے لیے ترتیب کے وقت ایک ایڈاپٹر تیار کرے۔ تیار کردہ ایڈاپٹر عکس کے بغیر سیریالائزیشن براہ راست انجام دیتا ہے، جو زیادہ سے زیادہ کارکردگی فراہم کرتا ہے۔

کسٹم Moshi ایڈاپٹر کیسے بنایا جائے؟

@ToJson (سیریالائزیشن) اور @FromJson (ڈی سیریالائزیشن) سے اینوٹیٹ کردہ میتھڈز کے ساتھ ایک کلاس بنائیں۔ مثال کو Moshi.Builder.add() کے ذریعے رجسٹر کریں۔ Moshi خودکار طور پر مناسب قسم کے ساتھ کام کرتے وقت ایڈاپٹر کو ڈھونڈ کر لاغو کرے گی۔

کیا Moshi Kotlin Multiplatform کو سپورٹ کرتی ہے؟

ہاں، Moshi ورزن 1.13.0 سے Kotlin Multiplatform کو سپورٹ کرتی ہے۔ یہ اسے KMP مناصب کے لیے واحد مقبول JSON حل بناتا ہے، جو تمام ہدف پلیٹ فارمز پر مشترک سیریالائزیشن کوڈ کے استعمال کی اجازت دیتا ہے۔

خلاصہ

  • Moshi « عکس کے بجائے کوڈ جینریشن کے ساتھ Square کی جدید JSON لائبریری
  • @JsonClass « ایڈاپٹر جینریشن کے لیے اینوٹیشن، ہاتھ سے لکھے کوڈ کی بہترین کارکردگی فراہم کرتا ہے
  • @Json « JSON کنجی ترتیب، @Transient « فیلڈوں کو سیریالائزیشن سے خارج کرنا
  • @ToJson اور @FromJson « کسی بھی قسم کے کسٹم ایڈاپٹر کے لیے سادہ API
  • ناموجودگی حفاظت « Moshi Kotlin اینوٹیشنز کو مانتی ہے اور بے موافقتی پر استثنا پھینکتی ہے
  • کارکردگی « سیریالائزیشن اور ڈی سیریالائزیشن آپریشنز میں Gson سے 2–5 گنا تیز
  • Kotlin Multiplatform « آلمگیر سیریالائزیشن کوڈ کے لیے KMP حمایت

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں