GSON kullanan Json'dan Kotlin Veri Sınıfı


105

Bunun gibi Java POJO sınıfım var:

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

ve Kotlin veri sınıfım var Bunun gibi

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

Nasıl temin etmek json keyherhangi değişkenlere kotlin data classgibi @SerializedNamejava değişkenleri ek açıklamanın?


1
Java'da bunu nasıl yaptın? Bir örnek gösterin.
nhaarman

Json seçici nedir?
voddan

@voddan bu json seçici ile kastettiğim, belirli json nesnesini / dizisini seçmek için kullanabileceğim dizelerdir: benim durumumda "konu", "id", "resim". Umarım bunu sana açıkladım. Teşekkürler :)
erluxman

@nhaarman Soruyu düzenledim, umarım demek istediğin budur
erluxman

Yanıtlar:


227

Veri sınıfı:

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

JSON'a:

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

JSON'dan:

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

36
Ek açıklamaları yalnızca bir değişken adı uyuşmazlığı olduğunda kullanın. Aksi takdirde, evet, gerekli değil
Vik

3
Bana göre, açıklamalar serileştirildiğinde dışlanabilen veya değişkenleri içeren sınıflara sahip olmamıza izin veriyor. Güçlendirme ile kullanıldığında çok kullanışlıdır. Bu, sunucuya çöp göndermez. Ayrıca, sunucu tarafında değişkenlerin adlarında değişiklik olduğunda, bunu doğrudan sınıf değişkeninde değiştirmek, açıklamaya göre daha zahmetlidir.
Deneb Chorny

11
@Vik Unutulmaması gereken bir şey, değişken adlarınızın muhtemelen gizlenmiş olabileceği (bir Android uygulamasında olduğu gibi), ancak ek açıklama olduğu gibi bırakılacağıdır
Caleb_Allen

@AntonGolovin Veri sınıfımı Json yönteminden geçiremiyorum. Veri sınıfımı java dosyasında bildirmem gerekiyor mu?
Ravi Yadav

Bunu yaparsanız, JSON formatını kaybedeceğinize inanıyorum ki bu da IllegalStateException'ın ilerlemesine neden olabilir
portfoliobuilder

19

Anton Golovin'in cevabına göre

Detaylar

  • Gson sürümü: 2.8.5
  • Android Studio 3.1.4
  • Kotlin sürümü: 1.2.60

Çözüm

Herhangi bir sınıf verisi oluşturun ve JSONConvertable arayüzü devralın

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

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

Kullanım

Veri sınıfı

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

JSON'dan

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

JSON'a

val json = object.toJSON()

SerializedNameAlan adlandırma stratejisi yerine ek açıklamayı neden kullanıyorsunuz , Vasily?
peterchaula

2
@Peter çünkü @SerializedNamejson anahtarıyla eşleşmeyen değişkenlerin özel isimlerini kullanmama izin verecek. Ve evet, @SerializedNameihtiyacınız yoksa kullanmayabilirsiniz .
Vasily Bodnarchuk

2

Benzerini Kotlin sınıfında kullanabilirsiniz

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
}

Ayrıca yuvalanmış sınıf için, yuvalanmış nesne varmış gibi kullanabilirsiniz. Sınıf için Seri adını girmeniz yeterlidir.

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

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

}

bu nedenle sunucudan yanıt alırsanız, her anahtar JOSN ile eşleşecektir.

Ayrıca, Listeyi JSON'a dönüştürün:

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

ndroid, JSON'dan Nesneye dönüştürme:

val json = getJson()
val topic = gson.fromJson(json, Topic::class.java)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.