使用GSON的Json的Kotlin数据类


105

我有这样的Java POJO类:

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

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

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

如何在java变量中提供json keykotlin data class诸如@SerializedName注解之类的任何变量?


1
您是如何用Java做到这一点的?显示一个例子。
nhaarman '17

什么是json选择器?
voddan

@voddan这些json选择器的意思是我可以用来选择特定json对象/数组的字符串:就我而言,是“ topic”,“ id”,“ image”。希望我向您说明。谢谢:)
erluxman's

@nhaarman我已编辑了问题,我希望那是您的意思
erluxman

Answers:


227

资料类别:

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

11
@Vik要注意的一件事是,您的变量名可能会被混淆(例如在Android应用程序中),但注释将保持不变
Caleb_Allen

@AntonGolovin我无法通过Json方法传递数据类,是否需要在Java文件中声明数据类?
拉维·亚达夫

如果你这样做,我相信你一定会失去其可能导致IllegalStateException异常的道路JSON格式
portfoliobuilder

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

为什么您使用SerializedName注解而不是字段命名策略Vasily?
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,将List转换为JSON:

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

ndroid从JSON转换为Object:

val json = getJson()
val topic = gson.fromJson(json, Topic::class.java)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.