簡體   English   中英

kotlin com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

[英]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: FATAL EXCEPTION: OkHttp Dispatcher Process: com.kabelash.kotlinrepo, PID: 4808 com.google.gson.JsonSyntaxException: java.lang .IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ at 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 返回一個 Json 對象數組。 因此,您需要將其解析為數組。

Instead of val feed = gson.fromJson(body, Feed::class.java) You should put 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是 object 而您的 json 是數組的形式,所以當 gson 反序列化它時,它期望{在開頭。 相反,它看到的是[

有幾個選項可以解決這個問題:

  • 如果您有權訪問 json 的源,請修改以適合Feed object。
  • 更改Feed以擴展List<T>Array<T>
  • 將列表/數組類型傳遞給 gson。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM