我正在使用一个显示货币价格的api。虽然我尝试了很多次,但我无法找到一种方法来跟踪JSONMap。所以我无法访问数据。
下面是我的JSON格式
{"USD":{"satis":"18.6391","alis":"18.6268","degisim":"0.07"},"EUR":{"satis":"19.2998","alis":"19.2894","degisim":"0.57"}
我的api接口代码如下:
interface CurrencyAPI {
@GET("embed/para-birimleri.json")
fun getData(): Call<List<CurrencyModel>>
}
我的主类
private fun loadData()
{
val retrofit=Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
val service=retrofit.create(CurrencyAPI::class.java)
val call=service.getData()
call.enqueue(object :Callback<List<CurrencyModel>>
{
override fun onResponse(
call: Call<List<CurrencyModel>>,
response: Response<List<CurrencyModel>>
) {
if (response.isSuccessful)
{
response.body()?.let {
currencyModels=ArrayList(it)
}
}
}
override fun onFailure(call: Call<List<CurrencyModel>>, t: Throwable) {
t.printStackTrace()
}
})
}
我的模型类
import com.google.gson.annotations.SerializedName
data class CurrencyModel(
@SerializedName("satis")
val selling:String,
@SerializedName("alis")
val buying:String,
@SerializedName("degisim")
val change:String
)
我尝试通过列表获取数据,但无法获取数据。
1条答案
按热度按时间4dc9hkyq1#
每次在JSON中看到
{
时,它都表示一个新对象的开始,这意味着您有一个具有多个值的顶级对象(在这里是USD
和EUR
),它们都是对象本身。但是您错误地尝试将整个JSON主体反序列化为列表/数组,而不是对象。现在,在决定如何反序列化整个JSON主体时,需要考虑以下几点:1.您是否提前知道所有可能的密钥?
1.在可预见的未来,这些密钥会保持不变吗?
1.这些键是静态的还是动态的?
如果你对前两个问题的回答都是否定的,或者对最后一个问题的回答是动态的,那么你就不想创建一个类来表示这个对象,而是使用一个
Map<String, CurrencyModel>
来代替。如果你对前两个问题的回答都是肯定的,而对最后一个问题的回答是静态的,那么你就可以创建一个类来表示整个身体。其中类的每个属性都具有类型CurrencyModel
,尽管您仍然可以使用上面的Map。