Обработка исключения одного объекта при отображении массива Json в массив POJO с помощью Gson в Android - PullRequest
0 голосов
/ 22 февраля 2020

Я читаю массив Json из стороннего API и отображаю его напрямую в массив POJO с помощью Gson. Часто я получаю недостающие данные для некоторых объектов, и все отсутствующие параметры имеют значение "N/A".

Мой класс POJO, смешанный из переменных String и Double, теперь, когда возвращается "N/A", где Ожидается значение Double, сбой приложения. Определенно, я могу l oop через них вручную и пропустить объекты с отсутствующими данными, но я ищу альтернативное решение, которое помогло бы мне сделать то же самое при отображении с использованием Gson.

POJO класс (синтаксис Kotlin )

class StockData(
    var symbol: String?,
    var name: String?,
    var currency: String?,
    var price: Double,
    @SerializedName("day_change")
    var dayChange: Double,
    @SerializedName("change_pct")
    var changePct: Double,
    var price90DayHigh: Double,
    var price90DayLow: Double
)

Отображение

val stockDataList = Gson().fromJson(response.body()!!.asJsonObject.get("data"),
                    Array<StockData>::class.java).toList()

Json с доступными данными

{
    "symbol": "AAK.ST",
    "name": "AAK AB (publ)",
    "currency": "SEK",
    "price": "189.15",
    "price_open": "190.90",
    "day_high": "190.95",
    "day_low": "188.30",
    "52_week_high": "203.80",
    "52_week_low": "131.62",
    "day_change": "-1.35",
    "change_pct": "-0.71",
    "close_yesterday": "190.50",
    "market_cap": "47993210000",
    "volume": "110641",
    "volume_avg": "476416",
    "shares": "253730934",
    "stock_exchange_long": "Stockholm Stock Exchange",
    "stock_exchange_short": "OMX",
    "timezone": "CET",
    "timezone_name": "Europe/Stockholm",
    "gmt_offset": "3600",
    "last_trade_time": "2020-02-21 17:29:54",
    "pe": "32.60",
    "eps": "5.32"
}

Json с отсутствующими данными

{
    "symbol": "HEMF-PREF.ST",
    "name": "N/A",
    "currency": "N/A",
    "price": "0.00",
    "price_open": "N/A",
    "day_high": "N/A",
    "day_low": "N/A",
    "52_week_high": "N/A",
    "52_week_low": "N/A",
    "day_change": "N/A",
    "change_pct": "N/A",
    "close_yesterday": "N/A",
    "market_cap": "N/A",
    "volume": "N/A",
    "volume_avg": "N/A",
    "shares": "N/A",
    "stock_exchange_long": "Stockholm Stock Exchange",
    "stock_exchange_short": "OMX",
    "timezone": "CET",
    "timezone_name": "Europe/Stockholm",
    "gmt_offset": "3600",
    "last_trade_time": "N/A",
    "pe": "N/A",
    "eps": "N/A"
}

1 Ответ

1 голос
/ 22 февраля 2020

Может быть 2 способа: 1. Вы создаете адаптер GsonAdapter, например

class StockDataAdapter: TypeAdapter<StockData> {
   fun read(reader: JsonReader): StockData {
      ....handle actual json parsing here, setting default value to field if parsing failed
    }
}

, а затем

val gson =GsonBuilder().registerTypeAdapter(StockData.class,  StockDataAdapter()).create();
val stockDataList = gson.fromJson(response.body()!!.asJsonObject.get("data"),
                Array<StockData>::class.java).toList()

Вы можете создать все поля типа String и проанализировать фактические значения на месте, например

class StockData (символ val: String ?, имя val: String ?, валюта val: String ?, цена val : String, @SerializedName ("day_change") val dayChange: String ?, @SerializedName ("change_pct") val changePct: String, val price90DayHigh: String, val price90DayLow: String) {val priceAsDouble: Double get () = try {price .toDouble ()} catch (e: Exception) {0.0}}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...