kotlin 如何访问JSON数据的两个括号,-Retrofit 2

sdnqo3pr  于 2022-11-25  发布在  Kotlin
关注(0)|答案(1)|浏览(152)

我正在使用一个显示货币价格的api。虽然我尝试了很多次,但我无法找到一种方法来跟踪JSONMap。所以我无法访问数据。

下面是我的JSON格式

  1. {"USD":{"satis":"18.6391","alis":"18.6268","degisim":"0.07"},"EUR":{"satis":"19.2998","alis":"19.2894","degisim":"0.57"}

我的api接口代码如下:

  1. interface CurrencyAPI {
  2. @GET("embed/para-birimleri.json")
  3. fun getData(): Call<List<CurrencyModel>>
  4. }

我的主类

  1. private fun loadData()
  2. {
  3. val retrofit=Retrofit.Builder()
  4. .baseUrl(BASE_URL)
  5. .addConverterFactory(GsonConverterFactory.create())
  6. .build()
  7. val service=retrofit.create(CurrencyAPI::class.java)
  8. val call=service.getData()
  9. call.enqueue(object :Callback<List<CurrencyModel>>
  10. {
  11. override fun onResponse(
  12. call: Call<List<CurrencyModel>>,
  13. response: Response<List<CurrencyModel>>
  14. ) {
  15. if (response.isSuccessful)
  16. {
  17. response.body()?.let {
  18. currencyModels=ArrayList(it)
  19. }
  20. }
  21. }
  22. override fun onFailure(call: Call<List<CurrencyModel>>, t: Throwable) {
  23. t.printStackTrace()
  24. }
  25. })
  26. }

我的模型类

  1. import com.google.gson.annotations.SerializedName
  2. data class CurrencyModel(
  3. @SerializedName("satis")
  4. val selling:String,
  5. @SerializedName("alis")
  6. val buying:String,
  7. @SerializedName("degisim")
  8. val change:String
  9. )

我尝试通过列表获取数据,但无法获取数据。

4dc9hkyq

4dc9hkyq1#

每次在JSON中看到{时,它都表示一个新对象的开始,这意味着您有一个具有多个值的顶级对象(在这里是USDEUR),它们都是对象本身。但是您错误地尝试将整个JSON主体反序列化为列表/数组,而不是对象。现在,在决定如何反序列化整个JSON主体时,需要考虑以下几点:
1.您是否提前知道所有可能的密钥?
1.在可预见的未来,这些密钥会保持不变吗?
1.这些键是静态的还是动态的?
如果你对前两个问题的回答都是否定的,或者对最后一个问题的回答是动态的,那么你就不想创建一个类来表示这个对象,而是使用一个Map<String, CurrencyModel>来代替。如果你对前两个问题的回答都是肯定的,而对最后一个问题的回答是静态的,那么你就可以创建一个类来表示整个身体。其中类的每个属性都具有类型CurrencyModel,尽管您仍然可以使用上面的Map。

相关问题