簡體   English   中英

Retrofit 在 Kotlin 中使用自定義 JsonDeserializer

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM