Kotlin / Android应用程序使用Retrofit2。 JSON查询不能按我期望的那样工作

在一个小的android应用程序工作,以帮助我了解JSON查询。 小测试应用程序的工作,直到我试图深入钻到我的测试JSON数据。

我将发布一个链接到我正在使用的JSON数据,以节省空间。 这是来自weatherwunderground的API并托管在myjson.com上的示例代码。

JSON: https //api.myjson.com/bins/19uurt

主要活动代码

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val retriever = CycloneRetriever() val callback = object : Callback { override fun onResponse(call: Call?, response: Response?) { println("Got a response!") println(response?.body()?.currenthurricane?.get(1)?.stormInfo?.get(0)?.stormName).toString() } override fun onFailure(call: Call?, t: Throwable?) { println("The thing, it failed!") } } retriever.getCyclones(callback) } 

}

这是我的类,帮助建立/收集JSON数据

 interface WeatherWunderGroundAPI { @GET("bins/19uurt") weatherwunderground.com API fun getCyclones() : Call } class Cyclones(val currenthurricane: List) class CurrentHurricane(val stormInfo: List) class StormInfo(val stormName: String) class CycloneRetriever { val apiRetriever: WeatherWunderGroundAPI init { val retrofitCyclone = Retrofit.Builder().baseUrl("https://api.myjson.com/") .addConverterFactory(GsonConverterFactory.create()).build() apiRetriever =retrofitCyclone.create(WeatherWunderGroundAPI::class.java) } fun getCyclones(callback: Callback) { val call = apiRetriever.getCyclones() call.enqueue(callback) } 

}

现在我只是想得到一个很好的回应,并打印到控制台。 最终,我将把JSON数据转储到一个RecyclerView中。

我可以得到一个很好的回应,如果我做以下Println,但它不会返回任何使用:

 println(response?.body()?.currenthurricane 

但是,一旦我试图进一步挖掘电流飓风,onFailure()被称为。

根据一些JSON文档,这应该得到我想要的: $.currenthurricane.[stormInfo].stormName作为一个例子。

但我无法弄清楚如何让我的代码工作。 我会给克拉克森一个尝试,但还没有弄清楚如何得到这个工作。

我在上面的代码中使用了Retrofit2和GSON插件。 我相当有信心的问题是我的JSON查询。

最后找出问题所在。 我在正确的轨道上,但需要一点调整我的JSON查询,需要改变我的课程。

我仍然在努力,我相信有一个更好的方法来做到这一点,但这里是快速和肮脏的。

改变了我的类,并添加了几个数据类:

 class Cyclones(val currenthurricane: List) class CurrentHurricane(val stormInfo: StormInfo, val Current: Current) data class StormInfo(val stormName: String) data class Current(val lat: Double, val lon: Double, val SaffirSimpsonCategory: Int, val Category: String, val WindSpeed: WindSpeed, val Movement: Movement) data class WindSpeed(val Kts: Int, val Mph: Int, val Kph: Int) data class Movement(val kts: Int, val mph: Int, val kph: Int) 

并将我的JSON查询更改为以下内容:

 val cycloneInfo = response?.body()?.currenthurricane?.get(0)?.stormInfo?.stormName val cycloneCurrentLat = response?.body()?.currenthurricane?.get(0)?.Current?.lat val cycloneCurrentLon = response?.body()?.currenthurricane?.get(0)?.Current?.lon val cycloneCurrentSSCat = response?.body()?.currenthurricane?.get(0)?.Current?.SaffirSimpsonCategory val cycloneCurrentCategory = response?.body()?.currenthurricane?.get(0)?.Current?.Category val cycloneCurrentWindKts = response?.body()?.currenthurricane?.get(0)?.Current?.WindSpeed?.Kts val cycloneCurrentMovement = response?.body()?.currenthurricane?.get(0)?.Current?.Movement?.kts