TRY ANDROID DEV

Android アプリ開発のコーディングネタ。あとエンジニアとしての活動

APIレスポンス(json)が一項目目と二項目目以降でレスポンス項目が異なって困った話

状況

  • 利用しようとしたAPIレスポンス(json)が一項目目と二項目目以降でレスポンス項目が異なるという鬼畜仕様。
  • そのため全てのレスポンス項目を含むレスポンスクラスを作成し、一旦レスポンスを受け取る。
  • Translatorクラスを作成し、レスポンスをドメインオブジェクトに変換する際に一項目目を取り除きたい。

レスポンスJSONはこんな感じ

[{"allcount":617021},{"title":"\u5143\u30fb\u9b54\u738b\u8ecd\u306e\u7adc\u9a0e\u58eb\u304c\u7d4c\u55b6\u3059\u308b\u731f\u5175\u56e3\u3002","ncode":"N6147EU"

コーディング

一項目目はallcountしか返却されず、その後のレスポンスでは各項目のデータが返却されるようなので、 いったん一項目目の場合はnullを返すTranslatorクラスとする。

    fun toNovelIntroduction(response : NarouNovelIntroductionResponse) : NovelIntroduction? {

        if (response.allcount == null) {
            return null
        }

        return NovelIntroduction(
            response.title ?: "",
            response.ncode?: "",
            response.userid?: "",
            response.writer?: "",
            response.story?: "",
            response.biggenre?: 0,
            response.genre?: 0,
            response.gennsaku?: "",
            response.keyword?: "",
            response.general_firstup?: "",
            response.general_lastup?: "",
            response.novel_type?: 0,
            response.end?: 0,
            response.general_all_no?: 0,
            response.length?: 0,
            response.time?: 0,
            response.isstop?: 0,
            response.isbl?: 0,
            response.isgl?: 0,
            response.iszankoku?: 0,
            response.istensei?: 0,
            response.pc_or_k?: 0,
            response.global_point?: 0,
            response.fav_novel_cnt?: 0,
            response.review_cnt?: 0,
            response.all_point?: 0,
            response.all_hyoka_cnt?: 0,
            response.sasie_cnt?: 0,
            response.kaiwaritu ?: 0,
            response.novelupdated_at?: "",
            response.updated_at?:"")
    }

返却データをfilterかけて対応。

    override fun search(word : String) : List<NovelIntroduction> {
        return searchService.getNovelList(word).map{response -> NovelIntroductionTranslator().toNovelIntroduction(response)}.filterNotNull()
    }

これで対応できた。

追記

kotlinにはmapNotNullというものがあるらしい。これを使うと以下のようにコーディングできる。便利。

    override fun search(word : String) : List<NovelIntroduction> {
        return searchService.getNovelList(word).mapNotNull{response -> NovelIntroductionTranslator().toNovelIntroduction(response)}
    }