web-dev-qa-db-ja.com

GSONを使用したJsonのKotlinデータクラス

私はこのようなJava POJOクラスを持っています:

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

kotlinデータクラスがあります

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

Java変数のjson keyアノテーションのようにkotlin data classの変数に@SerializedNameを提供するにはどうすればいいですか?

71
erluxman

データクラス

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)
166
Anton Holovin

Anton Golovin の回答に基づく

詳細

  • Gsonのバージョン:2.8.5
  • Android Studio 3.1.4
  • コトリン版:1.2.60

溶液

任意のクラスデータを作成して継承するJSONConvertable interface

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()
11

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
}

また、ネストされたクラスについても、ネストされたオブジェクトがある場合と同じように使用できます。クラスのシリアル化名を指定するだけです。

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

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

}

そのため、サーバーから応答を取得する場合、各キーはJOSNにマップされます。

0
pawan soni