Android json 映射改造

Android json mapping retrofit

我在使用 Retrofit 按请求获取映射 json 时遇到问题。我的动态 'data' 对象具有类似的嵌套对象。

{
  "data": {
    "DZ": {
      "country": "Algeria",
      "region": "Africa"
    },
    "AO": {
      "country": "Angola",
      "region": "Africa"
    },
    "BJ": {
      "country": "Benin",
      "region": "Africa"
    },
    "BW": {
      "country": "Botswana",
      "region": "Africa"
    },
    "BF": {
      "country": "Burkina Faso",
      "region": "Africa"
    },
    "BI": {
      "country": "Burundi",
      "region": "Africa"
    },
    "CV": {
      "country": "Cabo Verde",
      "region": "Africa"
    },
    "CM": {
      "country": "Cameroon",
      "region": "Africa"
    },
    "CF": {
      "country": "Central African Republic (the)",
      "region": "Africa"
    },
    "TD": {
      "country": "Chad",
      "region": "Africa"
    }
  }
}

有什么处理的建议吗?我想将所有对象收集在一个列表中。

您可以通过在 Kotlin 中制作数据 classes 来解决这个问题,如下所示:

data class MajorData(
    val `data`: Data
)

data class Data(
    val AO: AO,
    val BF: BF,
    val BI: BI,
    val BJ: BJ,
    val BW: BW,
    val CF: CF,
    val CM: CM,
    val CV: CV,
    val DZ: DZ,
    val TD: TD
)

现在,您基本上会将改造调用的响应传递给 MajorData class。

现在为了更清楚,您还应该为所有对象(例如 AODZ 等)制作数据 classes

示例:(考虑 AO

data class AO(
    val country: String,
    val region: String
)

请也为其他人做同样的事情。

希望这对您有所帮助。快乐编码! :)

各位。我使用映射解决了这个问题。我还使用 Moshi 将 json 转换为 kotlin 模型 class,对 API 调用进行改造,并使用协程实现简单的异步代码

下方 header 数据 class 包含一个国家/地区的地图

@JsonClass(generateAdapter = true)
data class MainModel(

    val data : Map<String, Country>

    )

国家class

@JsonClass(generateAdapter = true)
data class Country(
    @Json(name = "country")
    val country : String,
    @Json(name = "region")
    val region : String

)

我的api界面

interface Api {

    @GET("data/v1/countries?limit=251") suspend fun getAllCountries(): Response<MainModel>


    companion object {
        var api: Api? = null
        fun getInstance() : Api {
            if (api == null) {
                val retrofit = Retrofit.Builder()
                    .baseUrl("https://api.first.org/")
                    .addConverterFactory(MoshiConverterFactory.create())
                    .addCallAdapterFactory(CoroutineCallAdapterFactory())
                    .build()
                api = retrofit.create(Api::class.java)
            }
            return api!!
        }

    }
}

视图模型中的函数 class 我调用 api 请求

fun getAllCountries() {
       
        viewModelScope.launch {
            try {
                
                val response = repository.getAllCountries()
                
                withContext(Dispatchers.Main) {
                    if (response.isSuccessful) {
                        //do your code
                        
                    } else {
                        
                        onError("Error : ${response.message()} ")
                    }
                }
            } catch (e: IOException) {
                onError(e.message!!)
            }


        }

    }

这是帮助我理解协程的有用链接 https://medium.com/android-beginners/mvvm-with-kotlin-coroutines-and-retrofit-example-d3f5f3b09050

https://blog.mindorks.com/using-retrofit-with-kotlin-coroutines-in-android