java.lang.IllegalStateException:应该是BEGIN_OBJECT,但是是BEGIN_ARRAY?

问题描述

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

在我实现了网络通话的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 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数据类之下

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>

}

解决方法

您的响应为arraylist,但您可以作为对象访问

所以像这样改变响应

return new ApplicationRunner() {
            @Override
            public void run(ApplicationArguments args) throws Exception {
                WebSocketClient rsvpsSocketClient = new StandardWebSocketClient();

                rsvpsSocketClient.doHandshake(rsvpsWebSocketHandler,MEETUP_RSVPS_ENDPOINT);
            }
        };

然后

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

https://api.npoint.io/15c43d65bc7a989f47f1返回公司列表,每个公司都有成员列表。但是,您的界面希望链接返回单个成员,这是错误的。您应该首先创建与公司相对应的数据类,类似于您的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>>
}

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...