[英]Using default JsonDeserializer inside custom JsonDeserializer in Kotlin
[英]Retrofit with custom JsonDeserializer in Kotlin
我需要解析這個 json。 默認情況下它工作正常,但我需要添加時間戳,所以我使用自定義反序列化工廠。
[
{
"ccy": "USD",
"base_ccy": "UAH",
"buy": "26.60000",
"sale": "26.96000"
},
{
"ccy": "EUR",
"base_ccy": "UAH",
"buy": "28.95000",
"sale": "29.60000"
},
{
"ccy": "RUR",
"base_ccy": "UAH",
"buy": "0.35000",
"sale": "0.38500"
},
{
"ccy": "BTC",
"base_ccy": "USD",
"buy": "8610.8989",
"sale": "9517.3093"
}
]
但是 json:JsonElement? MyDeserializer 中的參數從不與 ArrayList 一起提供,總是在單個 object 中。 我如何為 ArrayList 讀取遠程 json,並對其進行修改?
class MyDeserializer : JsonDeserializer<ArrayList<CurrencyItem>> {
override fun deserialize(
json: JsonElement?,
typeOfT: Type?,
context: JsonDeserializationContext?
): ArrayList<CurrencyItem> {
//Clean array save result
var currrencyList = ArrayList<CurrencyItem>()
// Get remote json
val itemsJsonArray = jsonObject.asJsonArray
//Modify remote json to custom object with timestamp
for (item in itemsJsonArray) {
var JsonObject = item.asJsonObject
var ccy = JsonObject.get("ccy").asString
var base_ccy = JsonObject.get("base_ccy").asString
var buy = JsonObject.get("buy").asString
var sale = JsonObject.get("sale").asString
var timestamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
currrencyList.add(CurrencyItem(1, ccy, base_ccy, buy, sale, time))
}
return currrencyList
}
}
將自定義轉換器添加到 retrofit
//Add converter to retrofit
val retrofit =
Retrofit.Builder().baseUrl("https://api.privatbank.ua/")
//My custom converter
.addConverterFactory(GsonConverterFactory.create(customGson))
.client(okkHttpclient)
.build()
問題是您使用錯誤的類型注冊了反序列化器:
JsonDeserializer<ArrayList<CurrencyItem>>
您的反序列化器的類型是
ArrayList<CurrentItem>
然而,你正在注冊它
CurrencyItem::class.java
現在,注冊泛型類型並不像普通類型那樣簡單。 在您的情況下,您需要:
Type currencyItemListType = new TypeToken<ArrayList<CurrencyItem>>() {}.getType();
registerTypeAdapter(currencyItemListType, MyDeserializer())code here
這樣,當 de retrofit 調用返回成功代碼(2xx)時,它應該自動嘗試使用您的反序列化器反序列化 json
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.