使用 GSON 来自 Json 的 Kotlin 数据 Class
Kotlin Data Class from Json using GSON
我有 Java POJO class 这样的:
class Topic {
@SerializedName("id")
long id;
@SerializedName("name")
String name;
}
我有一个 Kotlin 数据 class 像这样
data class Topic(val id: Long, val name: String)
如何将 json key
提供给 kotlin data class
的任何变量,例如 java 变量中的 @SerializedName
注释?
数据class:
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)
基于
的回答
详情
- Gson版本:2.8.5
- Android Studio 3.1.4
- Kotlin 版本:1.2.60
解决方案
Create any class data and inherit JSONConvertable interface
interface JSONConvertable {
fun toJSON(): String = Gson().toJson(this)
}
inline fun <reified T: JSONConvertable> String.toObject(): T = Gson().fromJson(this, T::class.java)
用法
数据class
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
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
}
对于嵌套 class,如果有嵌套对象,您也可以使用相同的方法。只需为 Class.
提供序列化名称
@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)
android 从 JSON 转换为对象:
val json = getJson()
val topic = gson.fromJson(json, Topic::class.java)
我有 Java POJO class 这样的:
class Topic {
@SerializedName("id")
long id;
@SerializedName("name")
String name;
}
我有一个 Kotlin 数据 class 像这样
data class Topic(val id: Long, val name: String)
如何将 json key
提供给 kotlin data class
的任何变量,例如 java 变量中的 @SerializedName
注释?
数据class:
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)
基于
的回答
详情
- Gson版本:2.8.5
- Android Studio 3.1.4
- Kotlin 版本:1.2.60
解决方案
Create any class data and inherit JSONConvertable interface
interface JSONConvertable {
fun toJSON(): String = Gson().toJson(this)
}
inline fun <reified T: JSONConvertable> String.toObject(): T = Gson().fromJson(this, T::class.java)
用法
数据class
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
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
}
对于嵌套 class,如果有嵌套对象,您也可以使用相同的方法。只需为 Class.
提供序列化名称@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)
android 从 JSON 转换为对象:
val json = getJson()
val topic = gson.fromJson(json, Topic::class.java)