Moshi Square کی ایک جدید JSON لائبریری ہے، جو Gson کی محدودیتوں کو مدنظر رکھتے ہوئے خاص طور پر Kotlin اور Android کے لیے تیار کی گئی ہے۔ یہ Kotlin کی null حفاظت کے ساتھ مکمل طور پر مطابق ہے، ترتیب کے وقت کوڈ تیار کرتی ہے اور عکس کا استعمال نہیں کرتی، جو کارکردگی اور بھروسگی کو بہتر بناتا ہے۔ Square Moshi, 2024 کے مطابق، Moshi قابل پیش گوئی سیریالائزیشن فراہم کرتی ہے اور کسی بھی قسم کے ڈیٹا کے لیے کسٹم ایڈاپٹر کی حمایت کرتی ہے۔
اہم نکات
Moshi JVM، Android اور Kotlin Multiplatform کے لیے ایک JSON لائبریری ہے، جو Square (OkHttp اور Retrofit کے مصنفین) نے تیار کی ہے۔ Gson کے برعکس، Moshi عکس پر انحصار نہیں کرتی « @JsonClass(generateAdapter = true) اینوٹیشن کے ذریعے ایڈاپٹر ترتیب کے وقت پر تیار ہوتے ہیں۔ یہ Moshi کو Kotlin کے مخصوص کلیس کے ساتھ کام کرتے وقت تیز، محفوظ اور زیادہ قابل پیش گوئی بناتا ہے۔
Moshi اور اس کے پیشرو کے درمیان بنیادی فرق عکس کو مسترد کرنا ہے۔ عکس Gson کو تیاری کے بغیر کسی بھی کلاس کے ساتھ کام کرنے کی اجازت دیتا ہے، لیکن اس کی قیمت سسٹم کی سست ابتدائیی، مرتب کرنے والے کی طرف سے بہترین کرنے کی ناقابلیت اور ران ٹائم خرابیوں کا خطرہ ہے۔ Moshi کو کوڈ جینریشن کے لیے کلاس کے واضح اعلان کی ضرورت ہے، لیکن اس کے بدلے میں ہاتھ سے لکھے کوڈ کی بہترین کارکردگی اور ترتیب کے وقت پر مکمل ٹائپ حفاظت فراہم کرتی ہے۔
// 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 سے اینوٹیٹ نہیں ہوتی۔ یہ طریقہ اس بات کی ضمانت دیتا ہے کہ ڈیویلپر ہر مخصوص کلاس کے لیے کوڈ جینریشن کی کارکردگی اور عکس کی لچیلیپی کے درمیان واضح طور پر انتخاب کرتا ہے۔
Builder کے ذریعے Moshi تیار کرنے کے بعد، ڈیویلپر کو Moshi کا ایک مثال ملتا ہے اور مطلوبہ کلاس کے لیے ایک ایڈاپٹر کی درخواست کرتا ہے۔ JsonAdapter مرکزی آبجیکٹ ہے جو toJson() کے ذریعے سیریالائزیشن اور fromJson() کے ذریعے ڈی سیریالائزیشن انجام دیتا ہے۔ اگر کلاس @JsonClass(generateAdapter = true) سے اینوٹیٹ ہے تو Moshi خودکار طور پر تیار کردہ ایڈاپٹر استعمال کرتی ہے، ورنہ بیک اپ کے طور پر عکسی KotlinJsonAdapterFactory لاغو کرتی ہے۔ یہ طریقہ کسی بھی پیمانے اور پیچیدگی کے مناصب کے لیے کوڈ جینریشن کی بہترین کارکردگی کو عکسی میکانزم کی لچیلیپی کے ساتھ جوڑتا ہے۔ Moshi چھوٹے ایپلیکیشنز اور سو ایپلیکیشنز سے لے کر سیکڑوں ڈیٹا ماڈل کے ساتھ بڑے کارپوریٹ مناصب کے لیے بھی موزوں ہے۔
// 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 اینوٹیشن Gson کے @SerializedName کو بدلتا ہے اور اسی طرح کام کرتا ہے: kotlinName فیلڈ "kotlin_name" JSON کنجی سے منسلک ہوتا ہے۔ ان اقسام کے لیے جنہیں Moshi طرح کے مطابق سیریالائز نہیں کر سکتی (مثال کے طور پر LocalDate)، ڈیویلپر @ToJson اور @FromJson میتھڈز کے ساتھ ایک کلاس بناتا ہے۔ ایڈاپٹر Moshi.Builder.add() کے ذریعے رجسٹر ہوتے ہیں اور عالمی طور پر یا کسی مخصوص قسم پر لاغو ہوتے ہیں۔ Moshi سیل کلاس اور @JsonClass کے ذریعے واضح امتیاز کنندہ کے ساتھ پولی مارفک سیریالائزیشن کی حمایت کرتی ہے، جو دستی فیلڈ جانچ کے بغیر JSON میں قسم کے درجہ بندی کے ساتھ کام کرنے کی اجازت دیتا ہے۔ ڈی سیریالائزیشن کے دوران، Moshi طرح کے مطابق ناشناسہ JSON کنجیوں کو نظر انداز کرتی ہے، کلائنٹ کوڈ کو بدلے بغیر سرور کی جانب نئے فیلڈ شامل کرتے وقت پشت کناتی مطابقت کی ضمانت دیتی ہے۔ ڈبگنگ کے لیے، failOnUnknown کے ذریعے سخت موڈ چالو کیا جا سکتا ہے، جو ناشناسہ کنجیاں ملنے پر استثنا پھینکتا ہے۔
// 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 کا موازنہ ایک Android منصوبے کے لیے JSON لائبریری چینتی کرتے وقت ایک عام سوال ہے۔ Moshi کوڈ جینریشن، ناموجودگی کی حفاظت اور بہترین کارکردگی کے لیے جدید Kotlin ڈیویلپمنٹ میں کامیاب ہے۔ Gson Java مناصب، لیگسی کوڈ اور ایسے مناظر کے لیے موزوں رہتا ہے جہاں کم سے کم ترتیب اہم ہے۔ فرق بڑے ڈیٹا حجم اور پیچیدہ ماڈل کے ساتھ نمایاں ہو جاتا ہے۔
کارکردگی کے ٹیسٹ ظاہر کرتے ہیں کہ کوڈ جینریشن کے ساتھ Moshi سیریالائزیشن اور ڈی سیریالائزیشن کے کاموں میں Gson سے 2–5 گنا تیز ہے۔ Moshi کا بنیادی فائدہ Kotlin کی ناموجودگی کی حفاظت کا درست ہینڈلنگ ہے: اگر JSON میں کوئی فیلڈ غائب ہے اور ماڈل اسے معیاری قیمت کے بغیر non-null کے طور پر مقرر کرتا ہے، Moshi ڈی سیریالائزیشن کے وقت استثنا پھینک دیتی ہے، چھپے ہوئے نقاط کو روکتی ہے۔
| خصوصیات | Gson | Moshi |
|---|---|---|
| میکانزم | عکس | کوڈ جینریشن / عکس |
| ناموجودگی حفاظت | غیر موجودگی کو نہیں مانتا | مکمل 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 مناصب میں جائز ہے جہاں کارکردگی اور ٹائپ حفاظت اہم ہے۔
// سیریالائزیشن موازنہ: 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()
)
اکثر پوچھے جانے والے سوالات
Moshi Square کی Kotlin اور Android کے لیے ایک JSON لائبریری ہے جو عکس کے بجائے کوڈ جینریشن استعمال کرتی ہے۔ یہ اعلیٰ کارکردگی، Kotlin کی غیر موجودگی کی حفاظت کا درست ہینڈلنگ اور Kotlin Multiplatform کے ساتھ مطابقت فراہم کرتی ہے۔
Moshi بہترین کارکردگی (کوڈ جینریشن کے بائس 2–5 گنا تیز)، حفاظت (Kotlin null اینوٹیشنز کو مانتی ہے) اور حجم (~90 Kb چھوٹا) میں Gson سے بہتر ہے۔ Moshi Kotlin Multiplatform اور data class میں معیاری قیمتوں کو بھی سپورٹ کرتی ہے۔
@JsonClass(generateAdapter = true) Moshi کو ہدایت دیتا ہے کہ دی گئی کلاس کے لیے ترتیب کے وقت ایک ایڈاپٹر تیار کرے۔ تیار کردہ ایڈاپٹر عکس کے بغیر سیریالائزیشن براہ راست انجام دیتا ہے، جو زیادہ سے زیادہ کارکردگی فراہم کرتا ہے۔
@ToJson (سیریالائزیشن) اور @FromJson (ڈی سیریالائزیشن) سے اینوٹیٹ کردہ میتھڈز کے ساتھ ایک کلاس بنائیں۔ مثال کو Moshi.Builder.add() کے ذریعے رجسٹر کریں۔ Moshi خودکار طور پر مناسب قسم کے ساتھ کام کرتے وقت ایڈاپٹر کو ڈھونڈ کر لاغو کرے گی۔
ہاں، Moshi ورزن 1.13.0 سے Kotlin Multiplatform کو سپورٹ کرتی ہے۔ یہ اسے KMP مناصب کے لیے واحد مقبول JSON حل بناتا ہے، جو تمام ہدف پلیٹ فارمز پر مشترک سیریالائزیشن کوڈ کے استعمال کی اجازت دیتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں