2017-12-28 6 views
0

API를 사용하여 처음으로 (그리고 kotlin을 사용하는 경우) API에서 모델 객체로 데이터를 가져 오는 방법을 알아내는 데 어려움을 겪고 누군가가 나를 가리킬 수 있기를 바랬습니다. 올바른 방향. 아래 샘플 코드.okHTTP 및 GSON을 사용하여 API에서 데이터를 가져옴

val request = Request.Builder().header("X-Mashape-Key", keyVal).url(url).build() 
    //make request client 
    val client = OkHttpClient() 
    //create request 
    client.newCall(request).enqueue(object: Callback { 
     override fun onResponse(call: Call?, response: Response?) { 
      //grab as string, works fine 
      val body = response?.body()?.string() 
      //make my builder, works fine 
      val gson = GsonBuilder().create() 
       // to pass type of class to kotlin :: 
      val cardFeed = gson.fromJson(body, CardFeed::class.java) 

     } 

     override fun onFailure(call: Call?, e: IOException?) { 
      println("Failed to execute request") 
     } 
    }) 
} 

그 모든 디버그 의도 한대로, 내가 문자열을 얻고, 그것을 볼 수 있지만 여전히/카드 오브젝트 cardFeed에 널 덤프 다음 사용하여 작동하는 것 같다. "{기본": [{ "키": "값"등

내가 있으리라 믿고있어

몸을 다음과 같이

class CardFeed(val cards: List<Card>) 
class Card(val cardId: String, val name: String, val text: String, val flavor: String) 

내가 API에서지고있어 몸 문자열 읽기 [무엇이 나를 걸려 넘어 뜨리고 있지만 그것을 고치는 법을 모르겠습니다.

올바른 방향으로 아이디어 나 전환을하면 크게 감사 드리며 미리 감사드립니다.

답변

0

클래스 구조에 따르면, 당신은 API에서 얻을해야 JSON 개체가 올바른 키

{ 
    "cards":[ 
     { 
     "cardId":"<cardID>", 
     "name":"<name>", 
     "flavor":"<flavor>" 
     }, 
     { 
     "cardId":"<cardID>", 
     "name":"<name>", 
     "flavor":"<flavor>" 
     } 
    ] 
} 

해야한다 CardFeed.java). 올바른 키 ("cards", "cardId", "name", "flavor")가없는 경우 gson은 값에 null을 반환합니다.

+0

아! 그것을 얻었습니다. 나는 cardFeed val Basic을 JSON 객체의 최상위 레벨에 맞추기 위해 이름을 지어야했습니다. – Venaseph

0

okHttp는 저급 라이브러리입니다. JSON 기반 API를 사용하려면 Retrofit이 훨씬 적합한 라이브러리입니다. GSON 또는 Moshi와 같은 라이브러리를 사용하여 이미 많은 어려움을 겪고있는 변환기를 사용하고 있기 때문입니다. 당신이 gson.fromJson(body, CardFeed::class.java)를 사용하는 경우, 그것은 (할당 된 클래스의 변수 이름을 찾습니다 때문에

+0

감사합니다. – Venaseph

관련 문제