Класс данных Kotlin от Json с использованием GSON
У меня есть класс Java POJO, как это:
class Topic {
@SerializedName("id")
long id;
@SerializedName("name")
String name;
}
и у меня есть класс данных Kotlin Вот так
data class Topic(val id: Long, val name: String)
Как предоставить json key
любым переменным kotlin data class
, таким как аннотация @SerializedName
в переменных Java?
Ответы
Ответ 1
Класс данных:
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)
Ответ 2
Подробнее
- Версия Gson: 2.8.5
- Android Studio 3.1.4
- Котлин версия: 1.2.60
Решение
Создайте данные любого класса и унаследуйте интерфейс JSONConvertable interface
interface JSONConvertable {
fun toJSON(): String = Gson().toJson(this)
}
inline fun <reified T: JSONConvertable> String.toObject(): T = Gson().fromJson(this, T::class.java)
Usage
UsageКласс данных
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()
Ответ 3
Вы можете использовать подобное в классе 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.