我是Kotlin,Android和OOP的新手(Natural-ADABAS背景,从来没有Java,C ++等),所以我非常绝望。
我有一个API,其数据如下所示,一系列图书详情:
API数据样本
我对数据模型感到困惑。我知道它应该看起来像API中的数据并返回一个数组,但我究竟如何在Kotlin中编码呢?然后我该如何解析它?我已经阅读了一些教程,但它们都有所不同。有些使用对象,有些使用类。
我也可能通过将所有内容都放在主要活动中来打破一些标准,但我还没有达到那个部分。
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query
class MainActivity : AppCompatActivity()
{
private val api: RestAPI = RestAPI()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val apiGetBooks = api.getBooksList("token123123123")
val response = apiGetBooks.execute()
if (response.isSuccessful) {
val books = response.body()?.title
println(books)
} else {
println("error on API") // What do I do?
}
}
object Model {
val ResultArray : MutableList<BookProperties>? = null
}
data class BookProperties (val id: Int,val title: String, val coverURI: String, val pageURI: String, val pageCount: Int, val languageId: Int,val description: String, val isFree: Boolean) {
}
private val buriApi: MainActivity.BooksAPI? = null
class RestAPI {
private val buriApi: BooksAPI
init {
val retrofit = Retrofit.Builder()
.baseUrl("https://api.someurl.com")
.addConverterFactory(MoshiConverterFactory.create())
.build()
buriApi = retrofit.create(BooksAPI::class.java)
}
fun getBooksList(token: String): Call<BookProperties>{
return buriApi.getBooks(token)
}
}
fun getBooksList(token: String): Call<MainActivity.BookProperties> {
return buriApi!!.getBooks(token)
}
interface BooksAPI {
@GET("/v1/books")
fun getBooks (@Query("token")token: String) : Call<BookProperties>
}
}
答案 0 :(得分:2)
经过大量谷歌搜索后,我终于通过YouTube上的How to Quickly Fetch Parse JSON with OkHttp and Gson解决了我的问题。
fun fetchBooks () {
println("fetching books")
val url = "https://api.someurl.com/v1/books?"
val request = Request.Builder().url(url).build()
println(request)
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback {
override fun onResponse(call: Call?, response: Response?) {
val body = response?.body()?.string()
println(body)
}
override fun onFailure(call: Call?, e: IOException?) {
println("Failed to execute request")
e?.printStackTrace()
}
})
}
仍然需要格式化数据并弄清楚如何在我的Android模拟器中打开wifi,但至少我可以使用JSON。
答案 1 :(得分:0)
让我们从一个示例开始,我猜您可以根据您的要求对其进行映射。
我没有将你的JSON作为文本,所以我举了一个我的例子。
示例JSON响应
{
"status": true,
"message": "User created Successfully.",
"response": {
"user": {
"id": 12,
"email": "testmail@gmailtest.com"
},
"token": "eyJlbWFpbCI6ImVzaGFudHNhaHUxMTBAZ21hc2kyMmwuY29tIiwidXNlcklkIjoxNSwiaWF0IjoxNTIxNTYyNjkxfQ"
}
}
所以创建一个新类并将其命名为
<强> CreateResponse.kt 强> 并将这些对象和数组从json映射到数据类并在此处列出。
data class CreateUserResponse(override val status: Boolean? = null,
override val message: String? = null,
val response: Response? = null)
data class Response(val user: User?, val token: String)
data class User(val id: Int, val email: String)
很简单,现在使用Kotlin,您可以声明数据类,而无需每次为每个对象创建单独的文件,只需创建一个文件并立即声明所有文件。
我在这里附加了一些资源,可以帮助你更好地理解事情。
https://antonioleiva.com/retrofit-android-kotlin/
https://segunfamisa.com/posts/using-retrofit-on-android-with-kotlin