显示改造数据时出错:预期 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
我正在尝试使用改装将数据获取到我的应用程序,正在记录数据,但它没有显示。我不断收到此错误
预期 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