【发布时间】: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 就是这样做的。什么都得不到。
-
那么你需要确定为什么你没有得到服务器的响应。