使用GSON的Json的Kotlin数据类

时间:2017-05-22 16:34:13

标签: java json gson kotlin data-class

我有这样的Java POJO类:

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

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

json key

如何将kotlin data class提供给@SerializedName的任何变量,例如java变量中的{{1}}注释?

3 个答案:

答案 0 :(得分:163)

数据类:

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)

答案 1 :(得分:11)

基于Anton Golovin的答案

详细信息

  • Gson版本:2.8.5
  • Android Studio 3.1.4
  • 科特林版本: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()

答案 2 :(得分:0)

您可以在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映射。