Moshi @JsonQualifier를 이용하여 특정 필드만 바꾸기

Jinho Shin·2021년 9월 17일
0

안드로이드

목록 보기
3/4

이전글

이전에 쓴 글을 요약해서 말하면
Moshi의 Adapter를 이용하여 네트워크 요청 결과를 최종적으로 리턴 받기 전에
중간에서 원하는 객체로 바꾸는 내용에 대해 언급한적이 있습니다.

이전 글 막바지에 제가
객체 A를 Adapter를 이용하여 객체B로 바꾸지만 그 내용중에서 한 두개를
바꾸는 건데 비효율적이라고 언급한 내용이 있습니다.

그에 대한 내용입니다.

Moshi에서 @JsonQualifier를 이용하여 수정이 가능합니다
파싱 전체를 바꾸는 것이 아니라 개중 몇개만 수정하고 싶으신 경우라면
@JsonQualifier를 사용하는것이 훨씬 더 좋아보입니다.

방법은 아래와 같습니다.(공식 문서에도 있습니다)

  • @JsonQualifier를 이용하여 필드에 적용할 커스텀 Annotation을 만듭니다
  • 필드에 커스텀 Annotation을 달아준 다음
  • Adapter를 만들어 무엇이 어떻게 바뀔지를 정한다음
  • Moshi에 추가하면 간단하게 적용이 가능합니다.

Custom Annotation

@Retention(AnnotationRetention.RUNTIME)
@JsonQualifier
annotation class HasWarning {
아무것도 안쓰시면 됩니다.
}

필드에 커스텀 Annotation 적용

@JsonClass(generateAdapter = true)
@Entity(tableName = Const.TABLE_CRYPTO_CURRENCY, primaryKeys = [Const.COLUMN_TICKER])
data class CryptoCurrency(

    ...

    @Json(name = Const.JSON_UPBIT_MARKET_WARNING)
    @ColumnInfo(name = Const.COLUMN_HAS_WARNING)
    @HasWarning
    val hasWarning: Boolean
)

Adapter를 만들어 무엇이 어떤거로 바뀔지 정의

class CryptoCurrencyAdapter {

    @FromJson
    @HasWarning
    fun fromJson(hasWarning: String): Boolean {
        return hasWarning == Const.UPBIT_WARNING
    }

    @ToJson
    fun toJson(@HasWarning hasWarning: Boolean): String {
        return if(hasWarning) Const.UPBIT_WARNING else Const.UPBIT_NONE
    }
}

주의하실점은 `@FromJson, @ToJson을 다 정의를 해주셔야 합니다.

profile
I will be the King of

0개의 댓글