What's Moshi??

💀LeeSY·2022년 8월 3일
0
post-thumbnail

Moshi

  • API 통신 시, JSON과 객체 사이의 직렬화 및 역직렬화를 간단하고 신속하게 해주는 라이브러리
  • 내부 동작에서 reflection 사용

    Reflection : 자바의 기능 중 하나로, 클래스나 인터페이스의 정보에 직접 접근 가능케하는 API을 일컫는다.

    직렬화 : 특정 데이터를 다른 CPU로 보내기 전 통신이 가능하면서도 나중에 재구성이 가능한 포맷으로 환해주는 행위

    역직렬화 : 직렬화된 데이터를 다시 객체 형태로 변환하는 행위

JSON 처리

  • @JsonClass Annotation : JSON Object에 대응되는 역할을 한다. 해당 Annotation은 JSON Object에 대응되는 클래스 생성 시 상단에 붙인다.

  • 파라미터로 들어가는 generateAdapter를 true로 Set 해주어야 codegen 방식으로 직렬화, 역직렬화가 가능해진다.

  • @Json(name = "key-name") : JSON 내부의 Key-value 값에 붙인다. 해당 Annotation은 name 파라미터를 가지는데, 반드시 json 포맷의 key 값에 대응시켜야한다.

@JsonClass(generateAdapter = true)
data class Advice(
    @Json(name = "slip") val slip : Slip
)

Example Code

  • JSON 처리
data class Advice(
    @Json(name = "slip") val slip : Slip
)

data class Slip(
    val id: Int,
    val advice: String
)
  • API Interface 작성
interface AdviceService {
    @GET("advice")
    fun getAdvice() : Call<Advice>

    @GET("advice")
    suspend fun getAdviceSuspend() : Advice

    companion object {
        const val BASE_URL = "https://api.adviceslip.com/"
    }
}
  • Retrofit 설정
val retrofit = Retrofit.Builder()
    .baseUrl(AdviceService.BASE_URL)
    //Moshi 사용을 위한 ConverterFactory 설정 필수
    .addConverterFactory(MoshiConverterFactory.create())
    .build()

val adviceService = retrofit.create(AdviceService::class.java)
  • API 호출
CoroutineScope(Dispatchers.IO).launch {
	val advice = adviceService.getAdviceSuspend()
	withContext(CoroutineScope(Dispatchers.Main).coroutineContext) {
		binding?.textView?.text = advice.slip.advice
	}
}
profile
A little strange but passionate, sincere hard worker.

0개의 댓글

관련 채용 정보