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


104

私はこのような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


1
Javaでそれをどのように行いましたか?例を示します。
nhaarman

jsonセレクターとは
ヴォダン

@voddanこれらのjsonセレクターで私が意味したのは、特定のjsonオブジェクト/配列を選択するために使用できる文字列です。私の場合は、「topic」、「id」、「image」です。はっきりさせていただければ幸いです。ありがとう:)
erluxman

@nhaarman私は質問を編集しました。それがあなたの意味するところだと思います
erluxman

回答:


226

データクラス:

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
変数名が一致しない場合にのみ注釈を使用します。それ以外の場合は、そう、必要ありません
Vik

3
私の意見では、アノテーションを使用すると、シリアル化されたときに変数を除外または含めることができるクラスを作成できます。後付けで使用すると非常に便利です。これはサーバーにゴミを送信しません。また、サーバー側で変数の名前に変更がある場合、アノテーションよりもクラス変数で直接変更する方が苦痛です。
Deneb Chorny 2017年

10
@Vikの注意点の1つは、変数名が(Androidアプリのように)難読化される可能性があるが、注釈はそのまま残る
Caleb_Allen

@AntonGolovin Jsonメソッドからデータクラスを渡すことができません。Javaファイル内でデータクラスを宣言する必要がありますか?
Ravi Yadav、2018

これを行うと、JSON形式が失われ、IllegalStateExceptionが発生する可能性があります
ポートフォリオ

19

アントン・ゴロビンの回答に基づく

細部

  • Gsonバージョン:2.8.5
  • Android Studio 3.1.4
  • Kotlinバージョン: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()

SerializedNameVasily、フィールドの命名戦略の代わりにアノテーションを使用するのはなぜですか?
peterchaula

2
@Peter @SerializedNameは、jsonキーと一致しない可能性がある変数のカスタム名を使用できるようにするためです。そして、はい、あなたが@SerializedNameそれを必要としない場合、あなたは使用しないかもしれません。
Vasily Bodnarchuk、

2

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にマッピングされます。

Alos、リストをJSONに変換:

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.