다음과 같은 Java POJO 클래스가 있습니다.
class Topic {
@SerializedName("id")
long id;
@SerializedName("name")
String name;
}
Kotlin 데이터 클래스가 있습니다.
data class Topic(val id: Long, val name: String)
Java 변수 의 주석 과 같은 json key
변수에 를 제공하는 방법은 무엇입니까?kotlin data class
@SerializedName
답변
데이터 클래스 :
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
- 안드로이드 스튜디오 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
}
따라서 서버에서 응답을 받으면 각 키가 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)