web-dev-qa-db-ja.com

RetrofitとKotlinでmoshiを使用してjsonrrayをオブジェクトに解析する

Kotlinコルーチンを使用してJSON配列のMoshiライブラリを使用して解析を試みています。

コードの使用

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

JSON Arrayのデータクラスの解析中に問題が発生します。私は同じようにJSONオブジェクトを使用しましたが、正常に動作しますが、配列中にクラッシュします以下はクラッシュ行です

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

失敗したGloballaunchコルーチンから呼び出します

コード:

 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)
            }
        }
4
Yatin

タイプはList<T>だけにする必要があります。Moshiはコレクションインターフェースのみをサポートし、ArrayList<T>LinkedList<T>などの具象コレクションクラスはサポートしません。他の種類のコレクションについても同様です。 Set<T>の代わりにHashSet<T>Map<K, V>の代わりにHashMap<K, V>など.

1
Angus H

コルーチンには構文解析エラーがあるとは思わないので、以下を試してください Moshiを使用してJsonリストを読み取る

クイックスニペットは次のようになります。

// 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)
0
Sean