gson Kotlin:URL连接后出现Request.Builder().url json错误

kr98yfug  于 2022-11-23  发布在  Kotlin
关注(0)|答案(3)|浏览(197)

我有一个Kotlin函数,它从一个api端点获取数据。基础api端点在活动中的一个常量中。它看起来像这样:

object AppConstants {
       const val API_URL = "http://192.168.100.2:8000/api/"
    }

函数是这样的:

private fun thisGenreBookListJson(recyclerView: RecyclerView) {
        val categoryId: String = intent.getStringExtra(CATEGORY_ID).toString()
        // we get the url to list all the book genres
        val genreAPiUrl = AppConstants.API_URL +"books/category/$categoryId"

        val thisRequest = Request.Builder().url(genreAPiUrl).build()

        val client = OkHttpClient()
        // enqueue makes sure the thread runs in the background
        client.newCall(thisRequest).enqueue(object : Callback {
            override fun onResponse(call: Call, response: Response) {

                val thisBody = response.body?.string()

                val thisGson = GsonBuilder().create()

                val bookList = thisGson.fromJson(thisBody, BookList::class.java)

                this@CategoryViewerActivity.runOnUiThread {
                    recyclerView.adapter = CategoryBookListAdapter(bookList)
                }
            }

            override fun onFailure(call: Call, e: IOException) {
                println("Failed fetching URL $e")
            }
        })

请看val genreAPiUrl = "http://192.168.100.2:8000/api/books/category/$categoryId"这一行,如果保持不变,它会抛出一个com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $错误。但是,在调试应用程序时,URL的格式似乎是正确的。如果我用数据库中的一个类别替换该行中的$categoryId,代码运行时不会出现任何错误,在调试时,它与连接的代码相同。在函数的第一行,去除toString()也没有效果。
我在这里找不到任何类似问题。
我会错过什么呢?是连接问题吗?谢谢。

2uluyalo

2uluyalo1#

抛出IllegalStateException是因为服务器返回错误而不是预期的Json(我假设是404/40 x)。
由于使用有效的categoryId是可行的,因此从Intent检索的categoryId必须是无效的。
但是,在调试应用程序时,URL的格式似乎正确
这可能有两层意思:
1.使用调试器单步调试时,您可以验证categoryId是否是有效/正确的id,数据库中是否存在图书类别
1.使用调试器单步调试时,您可以验证URL的格式是否正确,但不验证categoryId是否有效/正确

案例1

由于调试会话显示categoryId是正确的,结论是这是一个争用条件。一定有什么东西没有正确设置Intent参数,或者设置得太晚,以至于当您单步调试时它是正确的,但在没有附加调试器的情况下运行时它还不正确。下一步是使用一些print语句来检查应用程序在没有调试器的情况下运行时categoryId是否正确(可能不正确),然后找出在Intent中设置id时出现的错误。

案例2

在这种情况下,你需要调试根本原因,那就是Intent中的id是错误的。没有看到更多的代码,就不可能知道id来自哪里,为什么它是无效的。

ewm0tg9j

ewm0tg9j2#

您可以尝试以下方法:

val genreAPiUrl = "${AppConstants.API_URL}books/category/$categoryId"
yizd12fk

yizd12fk3#

Expected BEGIN_OBJECT but was STRING at line 1 column 1

这意味着JSON的格式可能不正确。
Gson希望您的JSON字符串以从打开的对象开始

{

但React开始于

"

相关问题