使用GSON的Json的Kotlin数据类

erl*_*man 85 java json gson kotlin data-class

我有这样的Java POJO类:

class Topic {
    @SerializedName("id")
    long id;
    @SerializedName("name")
    String name;
}
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的Kotlin数据类

 data class Topic(val id: Long, val name: String)
Run Code Online (Sandbox Code Playgroud)

如何在java变量中提供类似注释的json key任何变量?kotlin data class@SerializedName

Ant*_*vin 187

数据类:

data class Topic(
  @SerializedName("id") val id: Long, 
  @SerializedName("name") val name: String, 
  @SerializedName("image") val image: String,
  @SerializedName("description") val description: String
)
Run Code Online (Sandbox Code Playgroud)

到JSON:

val gson = Gson()
val json = gson.toJson(topic)
Run Code Online (Sandbox Code Playgroud)

来自JSON:

val json = getJson()
val topic = gson.fromJson(json, Topic::class.java)
Run Code Online (Sandbox Code Playgroud)

  • 仅在变量名称不匹配时才使用注释.否则,是的,不需要 (24认同)
  • @Vik需要注意的一件事是你的变量名称可能会被混淆(比如在Android应用程序中),但注释将保持不变 (8认同)
  • 在我看来,注释使我们可以拥有在序列化时可以被排除或包含变量的类。与改造一起使用时非常有用。这不会将垃圾发送到服务器。同样,当服务器端的变量名称发生更改时,直接在类变量中进行更改比在注释中进行更改更痛苦。 (3认同)

Vas*_*huk 15

根据Anton Golovin的回答

细节

  • 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)
Run Code Online (Sandbox Code Playgroud)

用法

数据类

data class User(
    @SerializedName("id") val id: Int,
    @SerializedName("email") val email: String,
    @SerializedName("authentication_token") val authenticationToken: String) : JSONConvertable
Run Code Online (Sandbox Code Playgroud)

来自JSON

val json = "..."
val object = json.toObject<User>()
Run Code Online (Sandbox Code Playgroud)

致JSON

val json = object.toJSON()
Run Code Online (Sandbox Code Playgroud)

  • @Peter,因为`@ SerializedName`将允许我使用可能与json键不匹配的变量的自定义名称。是的,如果不需要,则可以不使用`@ SerializedName`。 (2认同)