जीएसओएन का उपयोग करते हुए जीसन से कोटलिन डेटा क्लास


105

मेरे पास इस तरह जावा पोजो वर्ग है:

class Topic {
    @SerializedName("id")
    long id;
    @SerializedName("name")
    String name;
}

और मेरे पास इस तरह एक कोटलिन डेटा क्लास है

 data class Topic(val id: Long, val name: String)

कैसे प्रदान करने के लिए json keyमें से किसी चर के kotlin data classतरह @SerializedNameजावा चर में एनोटेशन?


1
आपने इसे जावा में कैसे किया? एक उदाहरण दिखाओ।
नहरमन

क्या एक चयनकर्ता है?
वोडदान

@voddan मेरा मतलब उन जोंस सेलेक्टर से है, जो उस स्ट्रिंग्स का उपयोग कर सकते हैं, जिसका उपयोग मैं किसी विशेष json object / array का चयन कर सकता हूं: मेरे मामले में "विषय", "id", "image"। मुझे आशा है कि मैंने आपको स्पष्ट कर दिया है। धन्यवाद :)
erluxman

@ नहरमन ने प्रश्न संपादित किया है, मुझे आशा है कि आपका क्या मतलब है
erluxman

जवाबों:


227

डेटा वर्ग:

data class Topic(
  @SerializedName("id") val id: Long, 
  @SerializedName("name") val name: String, 
  @SerializedName("image") val image: String,
  @SerializedName("description") val description: String
)

JSON के लिए:

val gson = Gson()
val json = gson.toJson(topic)

JSON से:

val json = getJson()
val topic = gson.fromJson(json, Topic::class.java)

36
केवल एक चर नाम बेमेल होने पर एनोटेशन का उपयोग करें। अन्यथा, हाँ, जरूरत नहीं
विक

3
मेरी राय में, एनोटेशन से हमें कक्षाएं लेने की अनुमति मिलती है, जब धारावाहिक को बाहर रखा जा सकता है या चर शामिल कर सकते हैं। बहुत उपयोगी है जब रेट्रोफिट के साथ उपयोग किया जाता है। इससे सर्वर पर कचरा नहीं जाता है। इसके अलावा, जब सर्वर पक्ष पर चर के नाम में परिवर्तन होते हैं, तो एनोटेशन की तुलना में इसे सीधे कक्षा चर में बदलना अधिक दर्दनाक होता है।
डेनेब चोरनी

11
@ ध्यान देने योग्य बात यह है कि आपके चर नाम संभवतः (एंड्रॉइड ऐप की तरह)
बाधित किए

@AntonGolovin मैं अपने डेटा क्लास को Json मेथड से पास नहीं कर पा रहा हूँ। क्या मुझे java फाइल के अंदर अपना डेटा क्लास घोषित करने की आवश्यकता है?
रवि यादव

यदि आप ऐसा करते हैं, तो मेरा मानना ​​है कि आप JSON फॉर्मेट को खो देंगे, जिसके कारण IllegalStateException सड़क के नीचे हो सकती है
portfoliobuilder

19

एंटोन गोलोविन के जवाब के आधार पर

विवरण

  • Gson संस्करण: 2.8.5
  • एंड्रॉइड स्टूडियो 3.1.4
  • कोटलिन संस्करण: 1.2.60

उपाय

किसी भी वर्ग डेटा बनाएँ और JSONConvertable इंटरफ़ेस को इनहेरिट करें

interface JSONConvertable {
     fun toJSON(): String = Gson().toJson(this)
}

inline fun <reified T: JSONConvertable> String.toObject(): T = Gson().fromJson(this, T::class.java)

प्रयोग

डेटा वर्ग

data class User(
    @SerializedName("id") val id: Int,
    @SerializedName("email") val email: String,
    @SerializedName("authentication_token") val authenticationToken: String) : JSONConvertable

JSON से

val json = "..."
val object = json.toObject<User>()

JSON को

val json = object.toJSON()

आप SerializedNameक्षेत्र के नामकरण की रणनीति के बजाय एनोटेशन का उपयोग क्यों करते हैं , वसीली?
पेटेरकुला

2
@Peter क्योंकि @SerializedNameमुझे चर के कस्टम नामों का उपयोग करने की अनुमति देगा जो कि json कुंजी से मेल नहीं खा सकते हैं। और हाँ, @SerializedNameयदि आपको इसकी आवश्यकता नहीं है, तो आप उपयोग नहीं कर सकते ।
वासिली बोर्नार्चुक

2

आप कोटलिन वर्ग में समान उपयोग कर सकते हैं

class InventoryMoveRequest {
    @SerializedName("userEntryStartDate")
    @Expose
    var userEntryStartDate: String? = null
    @SerializedName("userEntryEndDate")
    @Expose
    var userEntryEndDate: String? = null
    @SerializedName("location")
    @Expose
    var location: Location? = null
    @SerializedName("containers")
    @Expose
    var containers: Containers? = null
}

और नेस्टेड क्लास के लिए भी आप उसी तरह का उपयोग कर सकते हैं जैसे कि नेस्टेड ऑब्जेक्ट है। बस कक्षा के लिए सीरियल नाम प्रदान करें।

@Entity(tableName = "location")
class Location {

    @SerializedName("rows")
    var rows: List<Row>? = null
    @SerializedName("totalRows")
    var totalRows: Long? = null

}

इसलिए यदि सर्वर से प्रतिक्रिया मिलती है तो प्रत्येक कुंजी JOSN के साथ मैप होगी।

Alos, JSON में सूची बदलें:

val gson = Gson()
val json = gson.toJson(topic)

ndroid JSON से ऑब्जेक्ट में परिवर्तित होता है:

val json = getJson()
val topic = gson.fromJson(json, Topic::class.java)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.