Gson — Java ऑब्जेक्ट को JSON में और वापस सीरियलाइज़ करने के लिए Google की लाइब्रेरी, Android डेवलपमेंट में व्यापक रूप से उपयोग की जाती है। यह मैन्युअल रूप से पार्सर लिखे बिना जटिल ऑब्जेक्ट ग्राफ़ को कॉम्पैक्ट JSON स्ट्रिंग में बदलने की अनुमति देती है। Google Gson, 2024 के अनुसार, लाइब्रेरी के GitHub पर 23 हज़ार से अधिक स्टार हैं और यह Java और Kotlin इकोसिस्टम में JSON के साथ काम करने के लिए सबसे लोकप्रिय समाधानों में से एक बनी हुई है।
मुख्य बातें
Gson Google द्वारा विकसित एक Java लाइब्रेरी है जो ऑब्जेक्ट को JSON प्रस्तुतीकरण में और वापस बदलने के लिए है। यह क्लास की संरचना का विश्लेषण करने के लिए रिफ्लेक्शन का उपयोग करती है, जो बिना पूर्व कॉन्फ़िगरेशन के काम करने की अनुमति देती है। Gson मनमाने Java ऑब्जेक्ट, कलेक्शन, ऐरे, जेनेरिक और नेस्टेड क्लास को सपोर्ट करती है। लाइब्रेरी को बुनियादी उपयोग के लिए एनोटेशन की आवश्यकता नहीं है, लेकिन बारीक ट्यूनिंग के लिए प्रदान करती है। रिफ्लेक्शन का मुख्य दोष इनिशियलाइज़ेशन के दौरान कम प्रदर्शन और कंपाइल समय पर अनुकूलन में असमर्थता है, जो सैकड़ों मॉडलों को डीसीरियलाइज़ करते समय Android एप्लिकेशन के कोल्ड स्टार्ट पर विशेष रूप से ध्यान देने योग्य है। इसके बावजूद, Gson अपनी स्थिरता और व्यापक दस्तावेज़ीकरण के कारण अधिकांश परियोजनाओं के लिए एक विश्वसनीय विकल्प बनी हुई है।
Gson को Google द्वारा 2008 में जारी किया गया था और यह जल्दी ही Android एप्लिकेशन में JSON के लिए वास्तविक मानक बन गया। Moshi और kotlinx.serialization के आगमन से पहले, Gson Kotlin परियोजनाओं के लिए एकमात्र लोकप्रिय विकल्प था। एकीकरण में आसानी — build.gradle में एक निर्भरता जोड़ना — और अनिवार्य एनोटेशन की अनुपस्थिति ने Gson को सभी स्तरों के डेवलपर्स के बीच लोकप्रिय बना दिया।
// build.gradle में Gson जोड़ना
dependencies {
implementation 'com.google.code.gson:gson:2.10.1'
}
// बुनियादी उपयोग
data class User(
val id: Int,
val name: String,
val email: String
)
val gson = Gson()
val user = User(1, "John", "john@test.com")
val json = gson.toJson(user)
println(json) // {"id":1,"name":"John","email":"john@test.com"}
बुनियादी सीरियलाइज़ेशन के अलावा, Gson व्यवहार कॉन्फ़िगर करने के लिए GsonBuilder प्रदान करती है: दिनांक स्वरूपण, HTML एस्केपिंग अक्षम करना, कुंजी केस और कस्टम इंस्टेंस। GsonBuilder उन प्रकारों के लिए कस्टम JsonSerializer और JsonDeserializer पंजीकृत करने की भी अनुमति देता है जिन्हें लाइब्रेरी स्वचालित रूप से संभाल नहीं सकती। कॉन्फ़िगरेशन लचीलापन GsonBuilder को आधुनिक Android डेवलपमेंट में विशिष्ट परियोजना आवश्यकताओं के अनुसार लाइब्रेरी को अनुकूलित करते समय एक अपरिहार्य और उपयोगी उपकरण बनाता है।
toJson रिफ्लेक्शन के माध्यम से फ़ील्ड का विश्लेषण करके Java ऑब्जेक्ट को JSON स्ट्रिंग में बदलता है। डिफ़ॉल्ट रूप से, Gson transient और static को छोड़कर सभी फ़ील्ड शामिल करता है। विधि किसी भी प्रकार का समर्थन करती है: प्रिमिटिव, ऑब्जेक्ट, कलेक्शन और ऐरे। fromJson उल्टा संचालन करता है, एक JSON स्ट्रिंग और लक्ष्य ऑब्जेक्ट क्लास स्वीकार करता है, और भरे हुए फ़ील्ड के साथ एक इंस्टेंस लौटाता है।
सीरियलाइज़ेशन के दौरान, Gson नेस्टेड फ़ील्ड सहित सभी ऑब्जेक्ट फ़ील्ड को पुनरावर्ती रूप से ट्रैवर्स करता है। चक्रीय संदर्भ StackOverflowError की ओर ले जाते हैं, इसलिए उन्हें @Expose एनोटेशन या कस्टम एडेप्टर के माध्यम से बाहर रखा जाना चाहिए। कलेक्शन के लिए, Gson तत्व प्रकारों को संरक्षित करता है, लेकिन जेनेरिक के साथ सूची को डीसीरियलाइज़ करते समय प्रकार की जानकारी संरक्षित करने के लिए TypeToken की आवश्यकता होती है।
// नेस्टेड ऑब्जेक्ट के साथ data class
data class Address(
val city: String,
val street: String
)
data class Employee(
val id: Int,
val name: String,
val address: Address
)
val gson = Gson()
val employee = Employee(1, "Alice",
Address("New York", "5th Ave"))
// JSON में सीरियलाइज़ेशन
val json = gson.toJson(employee)
// JSON से डीसीरियलाइज़ेशन
val jsonString = """
{"id":2,"name":"Bob","address":{"city":"London","street":"Baker St"}}
"""
val parsed = gson.fromJson(jsonString, Employee::class.java)
Gson सीरियलाइज़ेशन प्रक्रिया के प्रबंधन के लिए एनोटेशन का एक सेट प्रदान करती है। @SerializedName JSON कुंजी नाम निर्दिष्ट करता है जो फ़ील्ड नाम से भिन्न होता है। @Expose नियंत्रित करता है कि फ़ील्ड सीरियलाइज़ेशन में शामिल है या नहीं: GsonBuilder.excludeFieldsWithoutExposeAnnotation() के माध्यम से बनाया गया Gson केवल @Expose वाले फ़ील्ड को संसाधित करेगा। @Since और @Until फ़ील्ड वर्शनिंग को नियंत्रित करते हैं।
@SerializedName एनोटेशन नाम बेमेल की समस्या को हल करता है: सर्वर snake_case का उपयोग कर सकता है जबकि कोड में camelCase का उपयोग किया जाता है। एनोटेशन पिछड़ी संगतता के लिए एक मान और वैकल्पिक विकल्प स्वीकार करता है। @Expose संवेदनशील फ़ील्ड (पासवर्ड, टोकन) को @Expose(serialize = false) के रूप में चिह्नित करके सीरियलाइज़ेशन से छिपाने की अनुमति देता है। शामिल करने और बाहर करने के अलावा, @Expose को फ़ील्ड की श्वेत सूची बनाने के लिए GsonBuilder.excludeFieldsWithoutExposeAnnotation के साथ जोड़ा जा सकता है, जो कई फ़ील्ड वाले ऑब्जेक्ट को सीरियलाइज़ करते समय हमले की सतह को नियंत्रित करने में मदद करता है।
// Gson एनोटेशन के साथ मॉडल
data class UserResponse(
@SerializedName("user_id")
val userId: Int,
@SerializedName("full_name",
alternate = [Alternative("name")])
val fullName: String,
@Expose(serialize = false)
val password: String
)
// @Expose फ़िल्टरिंग के साथ Gson
val gson = GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.setPrettyPrinting()
.create()
val user = UserResponse(1, "John", "secret123")
println(gson.toJson(user))
// {"user_id":1,"full_name":"John"} — पासवर्ड बाहर रखा गया
जेनेरिक की समस्या Java और Kotlin में कंपाइल समय पर प्रकार मिटाना है। जब Gson List<User> को डीसीरियलाइज़ करता है, तो वह तत्व प्रकार नहीं जानता और List<Map<String, Any>> लौटाता है। प्रकार की जानकारी संरक्षित करने के लिए, Gson TypeToken प्रदान करता है — एक अमूर्त वर्ग जो अनाम वर्ग के माध्यम से प्रकार पैरामीटर को कैप्चर करता है। TypeToken के बिना, डेवलपर को मैन्युअल रूप से प्रत्येक तत्व को Map से लक्ष्य प्रकार में बदलना होगा, जिससे बोझिल कोड और प्रदर्शन हानि होती है।
TypeToken प्रकार मिटाने की समस्या को हल करता है। डेवलपर आवश्यक प्रकार पैरामीटर के साथ TypeToken का एक अनाम उपवर्ग बनाता है, और Gson सही डीसीरियलाइज़ेशन के लिए क्लास हस्ताक्षर से जानकारी का उपयोग करता है। TypeToken Map, Set और किसी भी अन्य पैरामीटराइज़्ड प्रकार के साथ भी काम करता है, जिसमें नेस्टेड जेनेरिक शामिल हैं। विशेष रूप से, Map<String, List<User>> के लिए, पूर्ण नेस्टेड प्रकार हस्ताक्षर वाले TypeToken की आवश्यकता होती है, अन्यथा Gson List<User> के बजाय मानों को List<Map<String, Any>> के रूप में डीसीरियलाइज़ करता है।
// सूची डीसीरियलाइज़ेशन के लिए TypeToken
data class Product(
val id: Int,
val title: String,
val price: Double
)
val jsonArray = """
[
{"id":1,"title":"Phone","price":599.0},
{"id":2,"title":"Laptop","price":1299.0}
]
"""
val gson = Gson()
val listType = object : TypeToken<List<Product>>() {}
val products: List<Product> =
gson.fromJson(jsonArray, listType.type)
// कस्टम डीसीरियलाइज़र
class LocalDateAdapter :
JsonDeserializer<LocalDate> {
override fun deserialize(
json: JsonElement,
typeOfT: java.lang.reflect.Type,
context: JsonDeserializationContext
): LocalDate {
return LocalDate.parse(json.asString)
}
}
कस्टम सीरियलाइज़ेशन तर्क के लिए, Gson JsonSerializer और JsonDeserializer इंटरफ़ेस का समर्थन करता है। वे GsonBuilder.registerTypeAdapter() के माध्यम से पंजीकृत होते हैं और उन प्रकारों को संभालने की अनुमति देते हैं जिन्हें लाइब्रेरी स्वचालित रूप से सीरियलाइज़ नहीं कर सकती: Java 8 दिनांक, गैर-मानक मानों वाले Enum, या स्रोत कोड तक पहुँच के बिना तृतीय-पक्ष वर्ग। एडेप्टर लागू करते समय, प्रदर्शन की निगरानी करना महत्वपूर्ण है: कस्टम एडेप्टर के अंदर रिफ्लेक्शन कॉल करना मैन्युअल नियंत्रण के लाभों को समाप्त कर देता है, इसलिए प्रत्यक्ष विधि और फ़ील्ड कॉल को प्राथमिकता दी जाती है। Gson इकोसिस्टम में gson-extras मॉड्यूल भी मौजूद है, जो UUID, Optional और Joda-Time दिनांक पहियों जैसे सामान्य प्रकारों के लिए एडेप्टर प्रदान करता है।
GsonBuilder बारीक ट्यूनिंग सीरियलाइज़ेशन के लिए दर्जनों विधियाँ प्रदान करता है। setPrettyPrinting पठनीयता के लिए आउटपुट JSON में इंडेंटेशन और लाइन ब्रेक जोड़ता है। disableHtmlEscaping स्ट्रिंग में HTML वर्ण एस्केपिंग को अक्षम करता है। setDateFormat दिनांक प्रारूप निर्दिष्ट करता है, जो गैर-मानक समय प्रस्तुतीकरण का उपयोग करने वाले सर्वरों के साथ काम करते समय महत्वपूर्ण है। setLenient उदार पार्सिंग मोड सक्षम करता है, जो कुछ JSON स्वरूपण त्रुटियों को अनदेखा करता है। addDeserializationExclusionStrategy कस्टम रणनीतियों के आधार पर प्रोग्रामेटिक रूप से फ़ील्ड को डीसीरियलाइज़ेशन से बाहर करने की अनुमति देता है। डिबगिंग के लिए, लॉगिंग के साथ संयुक्त setPrettyPrinting उपयोगी है — यह JSON प्रतिक्रियाओं को लॉग में पढ़ने योग्य बनाता है और बेमेल खोजने को सरल बनाता है।
GsonBuilder की एक महत्वपूर्ण विशेषता @Since और @Until एनोटेशन के माध्यम से फ़ील्ड वर्शनिंग प्रबंधन है। डेवलपर setVersion के माध्यम से ऑब्जेक्ट संस्करण निर्दिष्ट करता है, और Gson स्वचालित रूप से उनके संस्करण एनोटेशन के आधार पर फ़ील्ड शामिल या बाहर करता है। यह API विकास के दौरान उपयोगी है जब एक ही मॉडल का उपयोग सर्वर प्रोटोकॉल के विभिन्न संस्करणों के लिए किया जाता है। GsonBuilder परिवार प्रकारों की वैश्विक हैंडलिंग के लिए TypeAdapterFactory और जटिल Map कुंजियों के साथ सही काम करने के लिए complexMapKeySerialization पंजीकृत करने का भी समर्थन करता है।
अक्सर पूछे जाने वाले प्रश्न
Gson Google की लाइब्रेरी है जो Java ऑब्जेक्ट को JSON में और वापस बदलने के लिए है। इसका व्यापक रूप से Android एप्लिकेशन में सर्वर प्रतिक्रियाओं को पार्स करने, अनुरोधों को सीरियलाइज़ करने और स्थानीय स्टोरेज में डेटा संग्रहीत करने के लिए उपयोग किया जाता है।
डिफ़ॉल्ट रूप से, Gson सीरियलाइज़ेशन के दौरान null फ़ील्ड को छोड़ देता है। null मान शामिल करने के लिए, GsonBuilder.serializeNulls() का उपयोग करें। डीसीरियलाइज़ेशन के दौरान, JSON में गायब फ़ील्ड null रहते हैं या प्रकार के लिए डिफ़ॉल्ट मान लेते हैं।
Moshi Kotlin क्लास के लिए रिफ्लेक्शन का उपयोग नहीं करता, जो उच्च प्रदर्शन और पूर्वानुमानित व्यवहार प्रदान करता है। Moshi Kotlin की null सुरक्षा को भी सही ढंग से संभालता है, जबकि Gson null को non-null फ़ील्ड में डीसीरियलाइज़ कर सकता है, जिससे अपवाद हो सकता है।
@SerializedName JSON कुंजी को क्लास फ़ील्ड से बांधता है जब उनके नाम मेल नहीं खाते। उदाहरण के लिए, kotlinName फ़ील्ड और "kotlin_name" JSON कुंजी के लिए, @SerializedName("kotlin_name") एनोटेशन सही रूपांतरण सुनिश्चित करता है।
TypeToken एक अमूर्त वर्ग है जो अनाम वर्ग के माध्यम से प्रकार पैरामीटर को कैप्चर करता है। यह कलेक्शन और अन्य पैरामीटराइज़्ड प्रकारों को डीसीरियलाइज़ करने के लिए आवश्यक है, क्योंकि प्रकार मिटाने के कारण, Gson रनटाइम पर तत्व प्रकार को पुनर्प्राप्त नहीं कर सकता।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें