Kelas Data Kotlin dari Json menggunakan GSON

105

Saya memiliki kelas Java POJO seperti ini:

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

dan saya memiliki kelas data Kotlin Seperti ini

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

Bagaimana cara memberikan json keyke variabel kotlin data classseperti @SerializedNamepenjelasan di variabel java?

erluxman.dll
sumber
1
Bagaimana Anda melakukannya di Jawa? Tunjukkan contoh.
nhaarman
Apa itu pemilih json?
voddan
@voddan yang saya maksud dengan pemilih json itu adalah string yang dapat saya gunakan untuk memilih objek / array json tertentu: dalam kasus saya "topik", "id", "gambar". Saya harap saya menjelaskannya kepada Anda. Terima kasih :)
erluxman
@nhaarman Saya telah mengedit pertanyaan, saya harap itulah yang Anda maksud
erluxman

Jawaban:

227

Kelas data:

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

ke JSON:

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

dari JSON:

val json = getJson()
val topic = gson.fromJson(json, Topic::class.java)
Anton Holovin
sumber
36
Gunakan anotasi hanya jika ada nama variabel yang tidak cocok. Jika tidak, ya, tidak diperlukan
Vik
3
Menurut pendapat saya, anotasi memungkinkan kita memiliki kelas yang ketika diserialisasi dapat dikecualikan atau menyertakan variabel. Sangat berguna saat digunakan dengan retrofit. Ini tidak mengirim sampah ke server. Selain itu, jika ada perubahan nama variabel di sisi server, akan lebih sulit untuk mengubahnya secara langsung di variabel kelas daripada di anotasi.
Deneb Chorny
11
@Vik satu hal yang perlu diperhatikan adalah nama variabel Anda mungkin dapat dikaburkan (seperti di aplikasi Android) tetapi anotasi akan dibiarkan utuh
Caleb_Allen
@ AntonGolovin Saya tidak dapat meneruskan kelas data saya dari metode Json. Apakah saya perlu mendeklarasikan kelas data saya di dalam file java?
Ravi Yadav
Jika Anda melakukan ini, saya yakin Anda akan kehilangan format JSON yang dapat menyebabkan IllegalStateException di masa mendatang
portfoliobuilder
19

Berdasarkan jawaban Anton Golovin

Detail

  • Versi Gson: 2.8.5
  • Android Studio 3.1.4
  • Versi Kotlin: 1.2.60

Larutan

Buat data kelas apa pun dan warisi antarmuka JSONConvertable

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

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

Pemakaian

Kelas data

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

Dari JSON

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

Untuk JSON

val json = object.toJSON()
Bodnarchuk dengan mudah
sumber
Mengapa Anda menggunakan SerializedNameanotasi alih-alih strategi penamaan bidang, Vasily?
peterchaula
2
@Peter karena @SerializedNameakan memungkinkan saya untuk menggunakan nama khusus dari variabel yang mungkin tidak cocok dengan kunci json. Dan ya, Anda tidak dapat menggunakannya @SerializedNamejika Anda tidak membutuhkannya.
Vasily Bodnarchuk
2

Anda dapat menggunakan yang serupa di kelas Kotlin

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
}

Dan juga untuk kelas bersarang Anda bisa menggunakan sama seperti jika ada objek bersarang. Cukup berikan nama Serialize untuk Kelas.

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

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

}

jadi jika mendapat respon dari server setiap kunci akan dipetakan dengan JOSN.

Juga, ubah Daftar ke JSON:

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

ndroid mengkonversi dari JSON ke Object:

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