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。
现在为了更清楚,您还应该为所有对象(例如 AO
、DZ
等)制作数据 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
我在使用 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。
现在为了更清楚,您还应该为所有对象(例如 AO
、DZ
等)制作数据 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