【问题标题】:How do find the correct JSON object to pass into the GSON parser?如何找到正确的 JSON 对象以传递给 GSON 解析器?
【发布时间】:2018-04-09 00:46:20
【问题描述】:

我正在构建一个应用程序来学习如何使用 Kotlin 解析 JSON。在我的应用程序的第一阶段,我试图从 JSON 中提取图像并将它们粘贴到我的 ImageView 中,但不幸的是我收到了以下错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
            at com.google.gson.Gson.fromJson(Gson.java:888)
            at com.google.gson.Gson.fromJson(Gson.java:853)
            at com.google.gson.Gson.fromJson(Gson.java:802)
            at com.google.gson.Gson.fromJson(Gson.java:774)
            at 
ca.ozbek.popularmovies.MainActivity$fetchJSON$1.onResponse(MainActivity.kt:44)

这是它指向的行:

val movieFeed = gson.fromJson(body, MovieFeed::class.java)

在上面一行的断点调试项目后,我看到body = "okhttp3.internal....",这意味着这是我传递给 GSON 解析器的内容。我正在尝试从我的 API 中检索 poster_path:

{
  ...
  "poster_path": "/abc.jpg",
  ...
}

这是我尝试解析 JSON 数据的 MainActivity 代码:

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        recyclerView.layoutManager = GridLayoutManager(this, 3)

        fetchJSON()
    }

    fun fetchJSON(){
        val url = "https://api.themoviedb.org/3/movie/550?api_key=..."

        val request = Request.Builder().url(url).build()

        val client = OkHttpClient()
        client.newCall(request).enqueue(object : Callback{

            override fun onFailure(call: Call?, e: IOException?) {
                println("Failed to execute")
            }

            override fun onResponse(call: Call?, response: Response?) {
                val body = response?.body().toString()
                println(body)

                val gson = GsonBuilder().create()
                val movieFeed = gson.fromJson(body, MovieFeed::class.java)

                runOnUiThread { recycler_view.adapter = RecyclerAdapter(movieFeed) }

            }
        })
    }
}

class MovieFeed(val movies: List<Movie>)

class Movie(val original_title: String,
            val poster_id: Int,
            val overview: String,
            val vote_average: Double,
            val release_date: String,
            val reviews: String)

【问题讨论】:

  • 通常情况下,当服务器没有发回 JSON 并发回其他内容(例如错误 HTML 页面)时,就会出现此问题。将响应记录到 LogCat 并查看它的样子。
  • 我该怎么做?
  • 您的 println() 可能已经进入 LogCat。如果没有,请使用 android.util.Log。
  • @CommonsWare 就是这样做的。什么都得不到。
  • 那么你需要确定为什么你没有得到服务器的响应。

标签: android json kotlin


【解决方案1】:

Call string(),不是toString(),在ResponseBody

val body = response?.body().string()

【讨论】:

  • 这似乎是我的错误。非常感谢。我已经接受了你的回答。如果您认为我的问题问得很好,您能给我点个赞吗?
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多