java.lang.Исключение IllegalStateException: Ожидался BEGIN_OBJECT, но был BEGIN_ARRAY в строке 1 столбца 33 путь $.данные

#kotlin #kotlin-coroutines

#котлин #котлин-сопрограммы

Вопрос:

У меня тут проблема . Я использую Kotlin ,retrofit и Gson . Мне нужно создать пользователя и вставить его в список пользователей . Однако здесь я получил ошибку ,которая заключается в :

 java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 33 path $.data  

Не могли бы вы ,пожалуйста ,взглянуть, что происходит с моим кодом, пожалуйста, заранее большое вам спасибо !

Дооснащение.kt

 class RetrofitInstance {  companion object{  const val baseUrl = "https://gorest.co.in/public-api/"  fun getRetrofitInstance():Retrofit{  val logging = HttpLoggingInterceptor()  logging.level = HttpLoggingInterceptor.Level.BODY  val client = OkHttpClient.Builder()  .addInterceptor(logging)  .writeTimeout(30,TimeUnit.SECONDS)  .readTimeout(30,TimeUnit.SECONDS)  .build()  return Retrofit.Builder()  .baseUrl(baseUrl)  .client(client)  .addConverterFactory(GsonConverterFactory.create())  .build()  }  }  }  **RetrofitService.kt**    interface RetrofitService {  //1.get all users  //https://gorest.co.in/public-api/users  @GET("users")  @Headers("Accept:application/json","Content-Type:application/json")  fun getUsersList() : Calllt;UserListgt;   //2.search user by name  //https://gorest.co.in/public-api/users?name=c2  @GET("users")  @Headers("Accept:application/json","Content-Type:application/json")  fun searchUsers(@Query("name")username:String):Calllt;UserListgt;   //3.create a user  @POST("users")  @Headers("Accept:application/json", "Content-Type:application/json",  "Authorization: Bearer c0e900498b9d4b6bec02d4cff795de8187cf751f9a6074c9645b0730f9dfc3dd")  fun createUser(@Body params:User) : Calllt;UserResponsegt;   }  

UserAdapter.kt (Это для отображения списка пользователей ,на случай ,если что-то не так, я тоже разместил его)

 class UserAdapter(private var fragment: Fragment):RecyclerView.Adapterlt;UserAdapter.ViewHoldergt;() {  var usersList:Listlt;Usergt; = listOf()  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {  val binding:UserItemBinding = UserItemBinding.inflate(LayoutInflater.from(fragment.context),parent,false)  return ViewHolder(binding)  }   override fun onBindViewHolder(holder: ViewHolder, position: Int) {  holder.bind(usersList[position])  }   override fun getItemCount(): Int {  return usersList.size  }     class ViewHolder(view:UserItemBinding):RecyclerView.ViewHolder(view.root) {  val item_id = view.txtId  val item_name = view.txtName  val item_email = view.txtEmail  val item_gender = view.txtGender  val item_more = view.imgMore   fun bind(data:User){  item_name.text = data.name  item_email.text = data.email  item_gender.text = data.gender  }   } }  

CreateUserActivity This Activity is for create new user ,and I got suck here ..After I clicked the upload button ,it appears the error ..

 class AddAndUpdateActivity : AppCompatActivity() {  private lateinit var binding:ActivityAddAndUpdateBinding  private lateinit var viewModel : CreateUserViewModel  override fun onCreate(savedInstanceState: Bundle?) {  super.onCreate(savedInstanceState)  binding = ActivityAddAndUpdateBinding.inflate(layoutInflater)  setContentView(binding.root)  initViewModel()  createUserObservable()      binding.btnUploadUpdate.setOnClickListener {  createUser()  }  }     private fun initViewModel() {  viewModel = ViewModelProvider(this).get(CreateUserViewModel::class.java)   }   private fun createUserObservable() {  viewModel.getCreateNewUserObservable().observe(this, {  if(it==null){  Toast.makeText(this,"Fail to create user",Toast.LENGTH_SHORT).show()  }else{  Toast.makeText(this,"Success!",Toast.LENGTH_SHORT).show()  finish()  }  })  }   private fun createUser() {  val username = binding.edtUserName.text.toString()  val email = binding.edtEmail.text.toString()  val gender = binding.edtGender.text.toString()  val user = User("",username,email,gender)  Log.e("haha","create user:" user.id " ," user.name " ," user.email " ," user.gender)  viewModel.createUser(user)   }    }  

CreateUserViewModel.kt

 class CreateUserViewModel:ViewModel() {    var createUserLiveData:MutableLiveDatalt;UserResponse?gt; = MutableLiveData()  fun getCreateNewUserObservable():MutableLiveDatalt;UserResponse?gt; {  return createUserLiveData  }    fun createUser(user: User){  val retrofitInstance = RetrofitInstance.getRetrofitInstance().create(RetrofitService::class.java)  val call = retrofitInstance.createUser(user)  call.enqueue(object: Callbacklt;UserResponse?gt; {  override fun onResponse(call: Calllt;UserResponse?gt;, response: Responselt;UserResponse?gt;) {  if(response.isSuccessful){  createUserLiveData.postValue(response.body())  }else{  createUserLiveData.postValue(null)  }  }   override fun onFailure(call: Calllt;UserResponse?gt;, t: Throwable) {  createUserLiveData.postValue(null)  Log.e("haha","error reason:" t.message.toString())  }   })  } }  

Список пользователей.kt
Вот сущность пользователя:

 data class UserList(val data: Listlt;Usergt; )  @Entity @Parcelize data class User(  val id: String?,  val name: String?,  val email: String?,  val gender: String?,  ) : Parcelable  data class UserResponse(val code:Int?,val meta:String?,val data:User?)  

Ответ №1:

Мне кажется, что JSON содержит массив пользователей, в то время как UserResponse ожидает один объект. Следовательно, синтаксический анализ завершается неудачей.

Ответ пользователя должен быть обновлен, поэтому данные будут иметь тип List.

Если это была проблема, я предполагаю, что вы, возможно, уже решили ее.

Комментарии:

1. Привет, Роберт,да ,это то ,что ты предполагаешь, большое тебе спасибо !