Kotlin - запрос на модификацию с использованием RxJava дает нулевой ответ - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь получать новости от Guardian API.Я получаю нулевой ответ, все ниже.Я использую Kotlin, Retrofit и RxJava.Я знаю, что есть некоторые неправильно названные переменные / объекты, но я изменю их, когда избавлюсь от этой проблемы.

Модифицированный интерфейс

@get:GET("search?api-key=test")
    val news:Observable<News>

Модифицированный клиент

val instance : Retrofit
    get() {
        if (myInstance == null) {
            myInstance = Retrofit.Builder()
                    .baseUrl("https://content.guardianapis.com/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build()
        }
        return myInstance!!
    }

И функция, в которую я загружаюданные

private fun loadUrlData() {
        compositeDisposable.add(jsonApi.news
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe{news -> displayData(news)})
    }

Пример JSON

{  
   response:{  
      status:"ok",
      userTier:"developer",
      total:2063064,
      startIndex:1,
      pageSize:10,
      currentPage:1,
      pages:206307,
      orderBy:"newest",
      results:[  
         {  
            id:"politics/2018/sep/24/keir-starmer-labour-does-not-rule-out-remaining-in-eu",
            type:"article",
            sectionId:"politics",
            sectionName:"Politics",
            webPublicationDate:"2018-09-24T18:57:48Z",
            webTitle:"Keir Starmer: Labour does not rule out remaining in EU as option",
            webUrl:"https://www.theguardian.com/politics/2018/sep/24/keir-starmer-labour-does-not-rule-out-remaining-in-eu",
            apiUrl:"https://content.guardianapis.com/politics/2018/sep/24/keir-starmer-labour-does-not-rule-out-remaining-in-eu",
            isHosted:false,
            pillarId:"pillar/news",
            pillarName:"News"
         }
      ]
   }
}

Класс модели

data class News( val status: String, val userTier: String, val total: Int, val startIndex: Int, val pageSize: Int, val currentPage: Int, val pages: Int, val orderBy: String, val results: List<Result>)

Я полагаю, чтопроблема с последней функцией или с интерфейсом, но я не могу найти решение.

1 Ответ

0 голосов
/ 25 сентября 2018

Проблемы лежат в вашем классе модели данных.

В вашем JSON есть внешний узел (response), и если вы пытаетесь вернуть News, вы не получите его, потому что Retrofit не может сопоставить JSON с классом News.Добавьте внешний класс с именем Response, который содержит поле с именем response типа News, который должен это исправить.

Примерно так:

class Response(val response: News)

Примечание: у меня нетt добавили data перед классом, поскольку вам это не обязательно нужно.Ключевое слово data просто автоматически добавляет для вас некоторые дополнительные вещи, такие как toString(), equals() и hashCode(), но если вы на самом деле не используете их для чего-либо, я бы не рекомендовал добавлять ключевое слово data, так кактогда довольно бесполезно.

...