【问题标题】:Android json mapping retrofitAndroid json映射改造
【发布时间】:2021-10-01 23:25:13
【问题描述】:

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

{
  "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"
    }
  }
}

任何建议如何处理它?我想在一个列表中收集所有对象。

【问题讨论】:

    标签: android json kotlin mapping retrofit


    【解决方案1】:

    您可以通过如下方式在 Kotlin 中创建数据类来解决此问题:

    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 类。

    现在为了更清楚,您还应该为所有对象创建数据类,例如AODZ 等。

    示例:(考虑AO

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

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

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

    【讨论】:

      【解决方案2】:

      每个人。我使用映射解决了这个问题。我还使用 Moshi 将 json 转换为 kotlin 模型类,Retrofit 用于 API 调用和 Coroutines 以简化异步代码

      下面的标题数据类,其中包含一个国家/地区的地图

      @JsonClass(generateAdapter = true)
      data class MainModel(
      
          val data : Map<String, Country>
      
          )
      

      国家级

      @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!!
              }
      
          }
      }
      

      我调用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多