GSON을 사용하는 Json의 Kotlin 데이터 클래스


105

다음과 같은 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


1
Java에서 어떻게 했습니까? 예를 보여주세요.
nhaarman

JSON 선택기 란 무엇입니까?
voddan

@voddan 내가 그 json 선택기에서 의미하는 것은 특정 json 객체 / 배열을 선택하는 데 사용할 수있는 문자열입니다. 내 경우에는 "topic", "id", "image". 나는 당신에게 명확하게 해주기를 바랍니다. 감사합니다 :)
erluxman

@nhaarman 나는 질문을 편집했습니다, 나는 그것이 의미하는 바를 희망합니다
erluxman

답변:


227

데이터 클래스 :

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)

36
변수 이름이 일치하지 않는 경우에만 주석을 사용하십시오. 그렇지 않으면, 그래, 필요하지
비크

3
제 생각에는 주석을 통해 직렬화 될 때 변수를 포함하거나 제외 할 수있는 클래스를 가질 수 있습니다. 개조와 함께 사용할 때 매우 유용합니다. 이것은 쓰레기를 서버로 보내지 않습니다. 또한 서버 측에서 변수 이름이 변경된 경우 주석보다 클래스 변수에서 직접 변경하는 것이 더 고통 스럽습니다.
Deneb Chorny

11
참고로 @Vik 한 것은 당신의 변수 이름은 아마도 (안드로이드 응용 프로그램에서 같은) 난독 화 될 수 있지만, 주석이 그대로 남아있을 것입니다
Caleb_Allen

@AntonGolovin Json 메서드에서 데이터 클래스를 전달할 수 없습니다. Java 파일 내에서 데이터 클래스를 선언해야합니까?
Ravi Yadav

이렇게하면 IllegalStateException이 발생할 수있는 JSON 형식이 손실 될 것이라고 생각합니다.
Portfoliobuilder 19

19

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

SerializedNameVasily라는 필드 이름 지정 전략 대신 주석 을 사용하는 이유는 무엇 입니까?
peterchaula

2
@Peter @SerializedName는 json 키와 일치하지 않을 수있는 변수의 사용자 지정 이름을 사용할 수 있기 때문 입니다. 그리고 네, @SerializedName필요하지 않으면 사용 하지 않을 수 있습니다.
Vasily Bodnarchuk

2

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.