kotlin com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 预期 BEGIN_OBJECT 但 BEGIN_ARRAY 在第 1 行第 2 列路径 $
kotlin com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
我尝试在 Kotlin 中使用 OKHttp 解析 JSON 字符串,但它给了我以下错误并且应用程序崩溃了:
2019-09-30 15:27:24.871 4808-4933/com.kabelash.kotlinrepo E/AndroidRuntime:致命异常:OkHttp 调度程序
进程:com.kabelash.kotlinrepo,PID:4808
com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为 BEGIN_OBJECT 但在第 1 行第 2 列路径 $=BEGIN_ARRAY
在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
我的MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView_main.layoutManager = LinearLayoutManager(this);
fetchJson()
}
fun fetchJson() {
val url = "https://api.myurl.com/"
val request = Request.Builder().url(url).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback{
override fun onResponse(call: Call, response: Response) {
val body = response.body?.string()
println(body)
val gson = GsonBuilder().create()
val feed = gson.fromJson(body, Feed::class.java)
runOnUiThread {
recyclerView_main.adapter = MainAdapter(feed)
}
}
override fun onFailure(call: Call, e: IOException) {
println("Request Failed")
}
})
}
}
class Feed (val name: String, val created_at: String, val owner: Owner)
class Owner (val login: String, val avatar_url: String)
我的MainAdapter.kt
class MainAdapter(val feed: Feed): RecyclerView.Adapter<CustomViewHolder>(){
override fun getItemCount(): Int {
return feed.name.count()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val rowCell = layoutInflater.inflate(R.layout.repo_row, parent, false)
return CustomViewHolder(rowCell)
}
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
val fd = feed.name.get(position)
holder.view.titleText.text = fd.toString()
}
}
class CustomViewHolder(val view: View): RecyclerView.ViewHolder(view) {
}
我花了很多时间在里面,但我还是想不通。我该如何解决?有什么建议吗?
API returns Json 个对象的数组。因此你需要将它解析为数组。
而不是 val feed = gson.fromJson(body, Feed::class.java)
你应该放 val feed = gson.fromJson(body, Array<Feed>::class.java)
主适配器
class MainAdapter(val feed: Array<Feed>): RecyclerView.Adapter<CustomViewHolder>(){
override fun getItemCount(): Int {
return feed.count()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val rowCell = layoutInflater.inflate(R.layout.repo_row, parent, false)
return CustomViewHolder(rowCell)
}
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
val fd = feed.get(position)
holder.view.titleText.text = fd.name.toString()
}
}
class CustomViewHolder(val view: View): RecyclerView.ViewHolder(view) {
}
您的问题与行有关:val feed = gson.fromJson(body, Feed::class.java)
。这需要 json 并尝试反序列化为您提供的 class 。但是,Feed
是一个对象,而您的 json 是数组形式,因此当 gson 反序列化时,它期望在开始时有一个 {
。相反,它看到 [
.
有几个选项可以解决这个问题:
- 如果您有权访问 json 的源代码,请修改以适合
Feed
对象。
- 更改
Feed
以扩展 List<T>
或 Array<T>
。
- 将 list/array 类型传递给 gson。
我尝试在 Kotlin 中使用 OKHttp 解析 JSON 字符串,但它给了我以下错误并且应用程序崩溃了:
2019-09-30 15:27:24.871 4808-4933/com.kabelash.kotlinrepo E/AndroidRuntime:致命异常:OkHttp 调度程序 进程:com.kabelash.kotlinrepo,PID:4808 com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为 BEGIN_OBJECT 但在第 1 行第 2 列路径 $=BEGIN_ARRAY 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
我的MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView_main.layoutManager = LinearLayoutManager(this);
fetchJson()
}
fun fetchJson() {
val url = "https://api.myurl.com/"
val request = Request.Builder().url(url).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback{
override fun onResponse(call: Call, response: Response) {
val body = response.body?.string()
println(body)
val gson = GsonBuilder().create()
val feed = gson.fromJson(body, Feed::class.java)
runOnUiThread {
recyclerView_main.adapter = MainAdapter(feed)
}
}
override fun onFailure(call: Call, e: IOException) {
println("Request Failed")
}
})
}
}
class Feed (val name: String, val created_at: String, val owner: Owner)
class Owner (val login: String, val avatar_url: String)
我的MainAdapter.kt
class MainAdapter(val feed: Feed): RecyclerView.Adapter<CustomViewHolder>(){
override fun getItemCount(): Int {
return feed.name.count()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val rowCell = layoutInflater.inflate(R.layout.repo_row, parent, false)
return CustomViewHolder(rowCell)
}
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
val fd = feed.name.get(position)
holder.view.titleText.text = fd.toString()
}
}
class CustomViewHolder(val view: View): RecyclerView.ViewHolder(view) {
}
我花了很多时间在里面,但我还是想不通。我该如何解决?有什么建议吗?
API returns Json 个对象的数组。因此你需要将它解析为数组。
而不是 val feed = gson.fromJson(body, Feed::class.java)
你应该放 val feed = gson.fromJson(body, Array<Feed>::class.java)
主适配器
class MainAdapter(val feed: Array<Feed>): RecyclerView.Adapter<CustomViewHolder>(){
override fun getItemCount(): Int {
return feed.count()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val rowCell = layoutInflater.inflate(R.layout.repo_row, parent, false)
return CustomViewHolder(rowCell)
}
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
val fd = feed.get(position)
holder.view.titleText.text = fd.name.toString()
}
}
class CustomViewHolder(val view: View): RecyclerView.ViewHolder(view) {
}
您的问题与行有关:val feed = gson.fromJson(body, Feed::class.java)
。这需要 json 并尝试反序列化为您提供的 class 。但是,Feed
是一个对象,而您的 json 是数组形式,因此当 gson 反序列化时,它期望在开始时有一个 {
。相反,它看到 [
.
有几个选项可以解决这个问题:
- 如果您有权访问 json 的源代码,请修改以适合
Feed
对象。 - 更改
Feed
以扩展List<T>
或Array<T>
。 - 将 list/array 类型传递给 gson。