使用 GSON 实现 Json 中的 Kotlin 数据类

我有这样的 JavaPOJO 类:

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

我有一个 Kotlin 数据类,就像这样

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

如何为 kotlin data class的任何变量提供 json key,比如 Java 变量中的 @SerializedName注释?

130443 次浏览

资料类别:

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)

根据 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)

用法

数据类

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

你可以在 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


}

因此,如果从服务器获得响应,每个键将与 JSON 映射。

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)