#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. Привет, Роберт,да ,это то ,что ты предполагаешь, большое тебе спасибо !