使用okHTTP& amp;从API中提取数据GSON

时间:2017-12-28 20:26:57

标签: android android-studio kotlin

使用API​​&(以及kotlin)的新用户,我在确定如何将数据从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 / cards对象中。

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

我从API获取的正文字符串如下所示

body:&#34; {Basic&#34;:[{&#34; key&#34;:&#34; value&#34;,etc

我假设[是什么绊倒我,但不知道如何纠正它。

任何有关正确方向的想法或推动都会非常感激,并提前感谢。

2 个答案:

答案 0 :(得分:1)

根据您的类结构,您应该从API获取的JSON对象应该是

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

使用正确的密钥,因为当您使用gson.fromJson(body, CardFeed::class.java)时,它会在分配的类(CardFeed.java)中查找变量名称。如果你没有正确的密钥(“cards”,“cardId”,“name”,“flavor”),gson将为值返回null

答案 1 :(得分:0)

okHttp是一个低级库。为了使用基于JSON的API,Retrofit是一个更合适的库,因为它已经有使用像GSON或Moshi这样的库的转换器来为你做所有繁重的工作。