如何使用Kotlin从Retrofit获得Json数据? (Android Studio)

时间:2018-12-12 09:55:59

标签: json android-studio kotlin retrofit

试图将我的头缠在翻新上。我对此并不陌生,所以即使我已经观看了视频并在SO上阅读了一下,也感到困惑。我添加了一些JSON测试数据,如下所示:

[
    {"name":"John","age":30,"vehicle":"bicycle"}, 
    {"name":"Bob","age":32,"vehicle":"walking"}
]

它已经过验证,可以在以下地址找到:https://api.myjson.com/bins/lnjb8

已在manifestgradle实现中添加了Internet权限。

我的interface如下:

interface RetrofitCalls {

    @get:GET("lnjb8")
    val posts:Observable<List<RetrofitVariables>>
}

我有一个用于反序列化Json中的constructor数据的类:

class RetrofitVariables(var name: String, var age: Int, var vehicle: String) {}

然后在我的主类中,构建器如下所示:

var myRetrofit = Retrofit.Builder()
        .baseUrl("https://api.myjson.com/bins/")
        .addConverterFactory(GsonConverterFactory.create())
        .build()

但是从这里开始,我对如何获取Json数据一无所知。所以我的问题是,如何使用界面显示原始的Json数据(控制台很好),以及如何反序列化Json数据?

更新 我添加了这个: 在interface中:

@GET("lnjb8")
fun findPosts(): Call<List<RetrofitVariables>>

main类中:

var repository = myRetrofit.create(RetrofitCalls::class.java)

val jsonVariables = repository.findPosts().execute().body()

jsonVariables!!.forEach { println("TAG " + it) }

这是正确的吗?它一直崩溃,我认为这与同步调用而不是异步调用有关。我在某处看到可以像在.enqueue()中一样使用jasonVariables.enqueue(),但是我不确定如何使用它。

1 个答案:

答案 0 :(得分:0)

您在正确的道路上,快到了。现在您有了myRetrofit,您需要使用它。您可以通过以下方式使用它:

val repository = myRetrofit.create(RetrofitCalls::class.java)

一旦有了repository,就可以在其上调用方法。您的界面中没有任何方法,因此我不确定您的构造是否有效。对我有用的是:

interface RetrofitCalls {
    @GET("lnjb8")
    fun findPosts(): Call<List<RetrofitVariables>>
}

我使用过Call,但如果您要进行异步调用,也许Observable也可以使用。

如果您想要使用存储库的完整版本:

import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET

data class RetrofitVariables(var name: String, var age: Int, var vehicle: String)

interface RetrofitCalls {
    @GET("lnjb8")
    fun findPosts(): Call<List<RetrofitVariables>>
}

var myRetrofit = Retrofit.Builder()
        .baseUrl("https://api.myjson.com/bins/")
        .addConverterFactory(GsonConverterFactory.create())
        .build()

val repository = myRetrofit.create(RetrofitCalls::class.java)

fun main(args: Array<String>) {
    val call = repository.findPosts()
    val variables = call.execute().body()

    variables?.forEach {
        println(it)
    }
}

产生以下输出:

RetrofitVariables(name=John, age=30, vehicle=bicycle)
RetrofitVariables(name=Bob, age=32, vehicle=walking)