5 votes

Analyse d'un jsonrray en objet en utilisant moshi avec Retrofit et Kotlin

J'essaie d'analyser un tableau JSON à l'aide de la bibliothèque Moshi en utilisant les coroutines Kotlin.

Utilisation du code

 fun retrofitIndia(baseUrl : String) : Retrofit = Retrofit.Builder()
        .client(clientIndia)
        .baseUrl(baseUrl)
        .addConverterFactory(MoshiConverterFactory.create())
        .addCallAdapterFactory(CoroutineCallAdapterFactory())
        .build()

Je rencontre un problème lors de l'analyse de la classe de données pour le tableau JSON. J'ai utilisé la même chose pour JSON Object et cela fonctionne bien, mais pour array, il y a un crash. Voici la ligne de plantage

java.lang.IllegalArgumentException: Unable to create converter for java.util.ArrayList<data.india.Delta2>

J'appelle à partir de la coroutine Globallaunch où il échoue

Code :

 GlobalScope.launch(Dispatchers.Main) {
            val statsRequest = i.getStats()
            try {
                val response = statsRequest.await()
               if(response.){
                    val statsResponse = response.body() //This is single object Tmdb Movie response

                    Log.i("stats",""+statsResponse)
                }else{
                    Log.d("MainActivity ",response.errorBody().toString())
                }
            }catch (e: Exception){
                Log.e("Exception",e.localizedMessage)
            }
        }

3voto

Angus H Points 11

Vous devez faire en sorte que le type soit juste List<T> Moshi ne prend en charge que les interfaces de collection, et non les classes de collection concrètes telles que ArrayList<T> , LinkedList<T> etc. Il en va de même pour d'autres types de collections : utilisez Set<T> au lieu de HashSet<T> y Map<K, V> au lieu de HashMap<K, V> etc.

2voto

Sean Points 2329

Je ne pense pas que les coroutines aient quelque chose à voir avec l'erreur d'analyse, essayez ce qui suit Lire des listes Json avec Moshi

L'extrait rapide ressemblera à quelque chose comme :

// Single item declaration 
class SingleListItem(val title: String, val number: Int)

private var listMyData = Types.newParameterizedType(MutableList::class.java, SingleListItem::class.java)
private val adapter: JsonAdapter<List<SingleListItem>> = Moshi.Builder().add(KotlinJsonAdapterFactory()).build().adapter(listMyData)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X