জিএসওএন ব্যবহার করে জসন থেকে কোটলিন ডেটা ক্লাস


108

আমার কাছে জাভা পোজো ক্লাস রয়েছে:

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


4
আপনি জাভাতে এটি কীভাবে করলেন? একটি উদাহরণ দেখান।
nhaarman

জসন নির্বাচক কী?
ভোডদান

@ ভোডদান আমি এই জসন নির্বাচক দ্বারা যা বোঝাতে চেয়েছি তা হ'ল আমি যে নির্দিষ্ট স্ট্রিং / অ্যারে বেছে নিতে ব্যবহার করতে পারি সেগুলি: আমার ক্ষেত্রে "বিষয়", "আইডি", "চিত্র"। আমি আশা করি এটি আপনার কাছে পরিষ্কার করে দিয়েছি। ধন্যবাদ :)
এরলক্সম্যান

@ নহরমন আমি প্রশ্নটি সম্পাদনা করেছি, আমি আশা করি আপনি যা বোঝাতে চেয়েছিলেন
এরলক্সম্যান

উত্তর:


235

ডেটা ক্লাস:

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

জেএসএন-তে:

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

জেএসএন থেকে:

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

38
ভেরিয়েবলের সাথে মিল নেই তবেই টীকাগুলি ব্যবহার করুন। অন্যথায়, হ্যাঁ, প্রয়োজন নেই
বিক

4
আমার মতে, টীকাগুলি আমাদের ক্লাস করতে দেয় যা সিরিয়ালযুক্ত হলে বাদ দেওয়া যায় বা ভেরিয়েবলগুলি অন্তর্ভুক্ত করা যায়। রেট্রোফিটের সাথে ব্যবহার করার সময় খুব দরকারী। এটি সার্ভারে আবর্জনা প্রেরণ করে না। এছাড়াও, সার্ভারের পার্শ্বের ভেরিয়েবলের নামগুলি পরিবর্তন করার সময়, টীকাগুলির চেয়ে ক্লাস ভেরিয়েবলটিতে সরাসরি পরিবর্তন করা আরও বেদনাদায়ক।
ডেনেব চর্নি

13
@ ভিকের একটি বিষয় লক্ষণীয় হ'ল আপনার পরিবর্তনশীল নামগুলি সম্ভবত অস্পষ্ট করা যেতে পারে (একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন এর মতো) তবে টীকাটি অক্ষত থাকবে
কালেব_ অ্যালেন

@ অ্যান্টন গোলভিন আমি জেসন পদ্ধতি থেকে আমার ডেটা ক্লাসটি পাস করতে পারছি না? জাভা ফাইলে আমার ডেটা ক্লাস ঘোষণা করার দরকার আছে?
রবি যাদব

আপনি যদি এটি করেন তবে আমি বিশ্বাস করি যে আপনি JSON ফর্ম্যাটটি হারিয়ে ফেলবেন যার ফলে অবৈধ স্টেট এক্সপশনটি রাস্তায় নেমে যেতে পারে
পোর্টফোলিওবিল্ডার

19

আন্তন গোলোভিনের উত্তরের ভিত্তিতে

বিশদ

  • গসন সংস্করণ: 2.8.5
  • অ্যান্ড্রয়েড স্টুডিও ৩.১.৪
  • কোটলিন সংস্করণ: 1.2.60

সমাধান

যেকোন শ্রেণির ডেটা তৈরি করুন এবং জেএসএনসিভার্টেবল ইন্টারফেসের উত্তরাধিকারী করুন

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

জেএসওএন থেকে

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

জেএসওএন-তে

val json = object.toJSON()

SerializedNameফিল্ড নামকরণের কৌশল, ভাসিলির পরিবর্তে আপনি কেন টীকাটি ব্যবহার করবেন ?
পিটারচৌলা

4
@ পিটার কারণ @SerializedNameআমাকে ভেরিয়েবলগুলির কাস্টম নামগুলি ব্যবহার করতে অনুমতি দেবে যা জেএসন কী এর সাথে মেলে না। এবং হ্যাঁ, আপনার প্রয়োজন না @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 এর সাথে মানচিত্র করবে।

অ্যালোস, তালিকাটি জেএসএনে রূপান্তর করুন:

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

ndroid JSON থেকে অবজেক্টে রূপান্তর করুন:

val json = getJson()
val topic = gson.fromJson(json, Topic::class.java)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.