java.lang.IllegalStateException:预期为 BEGIN_OBJECT 但实际为 BEGIN_ARRAY?

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY?

我正在开发新的应用程序,我已经使用 rxjava 和 kotlin 实现了改造调用,但我收到以下异常 com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期 BEGIN_OBJECT 但 BEGIN_ARRAY 在第 1 行第 2 列路径 $

在我实施网络调用的 MemberActivity.kt 下面

class MemberActivity : AppCompatActivity() {

    private var memberAdapter:MemberAdapter? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_member)

        val compositeDisposable = CompositeDisposable()
        compositeDisposable.add(
            ServiceBuilder.buildService(SpectrumInterface::class.java).getMembers()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(
                    { member -> onResponse(member) },
                    { t -> onFailure(t) })
        )

    }

    private fun onFailure(t: Throwable) {
        Toast.makeText(this, t.message, Toast.LENGTH_SHORT).show()
    }

    private fun onResponse(member: Member) {

        memberAdapter = member?.let {
            MemberAdapter()
        }

        progressBar.visibility = View.GONE
        recyclerView.apply {
            setHasFixedSize(true)

            layoutManager = LinearLayoutManager(this@MemberActivity)
            adapter = memberAdapter
        }
    }
}

低于适配器 class

class MemberAdapter : RecyclerView.Adapter<MemberAdapter.MemberViewHolder>() {

    private lateinit var members: List <Member>


    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): MemberAdapter.MemberViewHolder {
      val view = LayoutInflater.from(parent.context).inflate(R.layout.member_list, parent, false)
        return MemberViewHolder(view)

    }

    override fun getItemCount(): Int {
       return members.size
    }

    override fun onBindViewHolder(holder: MemberAdapter.MemberViewHolder, position: Int) {
     return holder.bind(members[position])
    }

    class MemberViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        private val memberAge: TextView = itemView.findViewById(R.id.memberAge)
        private val memberName: TextView = itemView.findViewById(R.id.memberName)
        private val lastName: TextView = itemView.findViewById(R.id.lastName)
        private val firstName:TextView = itemView.findViewById(R.id.firstName)
        private val emailAddress:TextView = itemView.findViewById(R.id.emailAddress)
        private val phone:TextView = itemView.findViewById(R.id.phone)

        fun bind(member: Member) {

            memberAge.text = member.age.toString()
            memberName.text = member.name.toString()
            lastName.text = member.name.last
            firstName.text = member.name.first
            emailAddress.text = member.email
            phone.text = member.phone

        }
    }

}

低于Member.kt数据class

data class Member(
    @SerializedName("age")
    val age: Int,
    @SerializedName("email")
    val email: String,
    @SerializedName("_id")
    val id: String,
    @SerializedName("name")
    val name: Name,
    @SerializedName("phone")
    val phone: String
)

低于我的ServiceBuilder.kt

object ServiceBuilder {
    private val client = OkHttpClient.Builder()
        .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
        .build()


    private val retrofit = Retrofit.Builder()
        .baseUrl("https://api.npoint.io/")
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
        .client(client)
        .build()

    fun<T> buildService(service: Class<T>): T{
        return retrofit.create(service)
    }
}

在我的界面下方

interface SpectrumInterface {
  
    @GET("15c43d65bc7a989f47f1")
    fun getMembers(): Observable<Member>

}

你的响应是数组列表,但你是作为对象访问的

所以将响应更改为

fun getMembers(): Observable<List<Member>>

然后

private fun onResponse(member: List<Member>) 
{// your code
}

https://api.npoint.io/15c43d65bc7a989f47f1 returns公司名单,每个公司都有成员名单。但是,您的界面期望 link 到 return 单个成员,这是错误的。你应该先创建一个公司对应的数据class,类似于你的Member.kt:

data class Company {
    @SerializedName("_id")
    val id: String,
    @SerializedName("members")
    val members: List<Member>,
}

然后,您的界面将如下所示:

interface SpectrumInterface {  
    @GET("15c43d65bc7a989f47f1")
    fun getCompanies(): Observable<List<Company>>
}

从那里您可以访问所有公司,以及特定公司的所有成员。