显示改造数据时出错:预期 BEGIN_ARRAY 但在第 1 行第 2 列路径 $ 处 BEGIN_OBJECT

Error displaying data from retrofit: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

我正在尝试使用改装将数据获取到我的应用程序,正在记录数据,但它没有显示。我不断收到此错误

预期 BEGIN_ARRAY 但 BEGIN_OBJECT 在第 1 行第 2 列路径 $

不确定哪里做错了。

响应看起来与此类似

   {
        info: {
        count: 493,
        pages: 25
        },
        results: [
          {
            id: 1,
            name: "Rick Sanchez",
            status: "Alive",
            species: "Human",
            gender: "Male",
            image: "https://rickandmortyapi.com/api/character/avatar/1.jpeg",
          },
             // more characters
        ]
    }

我的数据class是这样的

    data class Character(
    @SerializedName("results")
    val results: List<Results>,

    @SerializedName("info")
    val info: List<Info>

)
data class Results(
    @SerializedName("id")
    val id: Int,

    @SerializedName("name")
    val name: String,

    //
)

这是我的适配器的样子

    class CharacterAdapter(var characters: ArrayList<Character>): RecyclerView.Adapter<CharacterAdapter.CharacterViewHolder>() {

    fun updateCharacters(newCharacters: List<Character>) {
        characters.clear()
        characters.addAll(newCharacters)
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CharacterViewHolder(
        LayoutInflater.from(parent.context).inflate(R.layout.character_item, parent, false)
    )

    override fun getItemCount() = characters.size

    override fun onBindViewHolder(holder: CharacterViewHolder, position: Int) {
        holder.bind(characters[position])
    }

    class CharacterViewHolder(view: View): RecyclerView.ViewHolder(view){
        private val characterName = view.characterName
        private val progressDrawable = getProgressDrawable(view.context)

        fun bind(character:Character){
            characterName.text = character.results[adapterPosition].name
        }
    }
}

我的视图模型

    class CharacterViewModel: ViewModel() {

    @Inject
    lateinit var charactersService: CharactersService

    init {
        DaggerApiComponent.create().inject(this)
    }

    private val disposable = CompositeDisposable()

    val characters = MutableLiveData<List<Character>>()
    val charactersLoadError = MutableLiveData<Boolean>()
    val loading = MutableLiveData<Boolean>()

    fun refresh(){
        fetchCharacters()
    }


    private fun fetchCharacters(){
        loading.value = true
        disposable.add(
            charactersService.getCharacters()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(object : DisposableSingleObserver<List<Character>>(){
                    override fun onSuccess(value: List<Character>?) {
                        characters.value = value
                        charactersLoadError.value = false
                        loading.value = false
                    }

                    override fun onError(e: Throwable?) {
                        //
                        Log.e(TAG, "${e?.message}")
                    }

                })
        )
    }

    override fun onCleared() {
       //
    }
}

我的Activity

class MainActivity : AppCompatActivity() {

    lateinit var viewModel: CharacterViewModel
    private val characterAdapter = CharacterAdapter(arrayListOf())

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProviders.of(this).get(CharacterViewModel::class.java)
        viewModel.refresh()

        charactersList.apply {
            layoutManager = LinearLayoutManager(context)
            adapter = characterAdapter
        }

        swipeRefresh.setOnRefreshListener {
            swipeRefresh.isRefreshing = false
            viewModel.refresh()
        }

        observeViewModel()
    }

    private fun observeViewModel(){
        viewModel.characters.observe(this, Observer { characters ->
            characters?.let{
                charactersList.visibility = View.VISIBLE
                characterAdapter.updateCharacters(it)
            }
        })

        viewModel.charactersLoadError.observe(this, Observer { isError ->

        })

        viewModel.loading.observe(this, Observer { isLoading ->
            isLoading?.let{ loadingView.visibility = if(it) View.VISIBLE else View.GONE
                if(it) {

                    charactersList.visibility = View.GONE
                }
            }

        })
    }
}

您将信息指定为列表,但需要对象。您可以通过更改 属性:

的类型来修复崩溃
@SerializedName("info")
val info: Info

而且我想你 return List 来自你的服务,但是 Json 中有一个对象:

 CharactersService.getCharacters(): Character

所以我遇到了问题,我写的模型 class 完全错了

data class CharacterModel(
    val results: List<CharResult>
)

data class CharResult(
    val created: String,
    val episode: List<String>,
    val gender: String,
    val id: Int,
    val image: String,
    val location: Location,
    val name: String,
    val origin: Origin,
    val species: String,
    val status: String,
    val type: String,
    val url: String
)

data class Location(
    val name: String,
    val url: String
)

data class Origin(
    val name: String,
    val url: String
)

PS 我找到了一个非常方便的 android 工作室插件,可以帮助您创建名为

的模型

JSON 到 Kotlin Class (JsonToKotlinClass) Seal