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>>
}
从那里您可以访问所有公司,以及特定公司的所有成员。
我正在开发新的应用程序,我已经使用 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>>
}
从那里您可以访问所有公司,以及特定公司的所有成员。