Получение значений SerializedName

#android #json #kotlin #android-volley

Вопрос:

Я начинаю изучать kotlin, и мне нужна помощь.

Итак, мой вопрос в том, как я могу получить serializedName, который я определил в другом классе?

Я использую эту строку для получения всех данных:

 val responseObject = Gson().fromJson(response, GifSearchResult::class.java)
Log.e("Data",""   responseObject.data)
 

Журнал:

 E/Data: GifDetails(type=gif, id=13Cmju3maIjStW, url=https://giphy.com/gifs/13Cmju3maIjStW, title=Biting Nails Reaction GIF by SpongeBob SquarePants, images=Images(original=Urls(width=500, height=373, url=https://media0.giphy.com/media/13Cmju3maIjStW/giphy.gif?cid=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tndamp;rid=giphy.gifamp;ct=g, size=194803, mp4Url=https://media0.giphy.com/media/13Cmju3maIjStW/giphy.mp4?cid=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tndamp;rid=giphy.mp4amp;ct=g, mp4Size=52101, webpUrl=https://media0.giphy.com/media/13Cmju3maIjStW/giphy.webp?cid=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tndamp;rid=giphy.webpamp;ct=g, webpSize=115414), fixedWidth=Urls(width=200, height=149, url=https://media0.giphy.com/media/13Cmju3maIjStW/200w.gif?cid=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tndamp;rid=200w.gifamp;ct=g, size=47897, mp4Url=https://media0.giphy.com/media/13Cmju3maIjStW/200w.mp4?cid=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tndamp;rid=200w.mp4amp;ct=g..............
 

Мне нужны только URL-адреса без чего-либо еще.

Это GifSearchResult.class:

 data class GifSearchResult(
    @Expose
    @SerializedName("data")
    var data: List<GifDetails>,

    @Expose
    @SerializedName("pagination")
    var pageInformation: PageInformation,
    ) {

    data class PageInformation(
        @Expose
        @SerializedName("total_count")
        var totalCount : Int = 0,
        @Expose
        @SerializedName("count")
        var count: Int = 0,
        @Expose
        @SerializedName("offset")
        var offset: Int = 0
    )
    data class GifDetails(
        @Expose
        @SerializedName("type")
        var type: String = "",
        @Expose
        @SerializedName("id")
        var id: String = "",
        @Expose
        @SerializedName("url")
        var url: String = "",
        @Expose
        @SerializedName("title")
        var title: String = "",
        @Expose
        @SerializedName("images")
        var images: Images = Images()
    ) {
        data class Images(
            @Expose
            @SerializedName("original")
            var original: Urls = Urls(),
            @Expose
            @SerializedName("fixed_width")
            var fixedWidth: Urls = Urls(),
            @Expose
            @SerializedName("fixed_width_downsampled")
            var downSampledFixedWidth: Urls = Urls(),
            @Expose
            @SerializedName("downsized")
            var downsized: Urls = Urls()
        )
        data class Urls(
            @Expose
            @SerializedName("width")
            var width: String = "",
            @Expose
            @SerializedName("height")
            var height: String = "",
            @Expose
            @SerializedName("url")
            var url: String = "",
            @Expose
            @SerializedName("size")
            var size: String = "",
            @Expose
            @SerializedName("mp4")
            var mp4Url: String = "",
            @Expose
            @SerializedName("mp4_size")
            var mp4Size: String = "",
            @Expose
            @SerializedName("webp")
            var webpUrl: String = "",
            @Expose
            @SerializedName("webp_size")
            var webpSize: String = ""
        )
        data class Url(
            @Expose
            @SerializedName("url")
            var Url: String = ""
        )

    }

}
 

Я могу получить доступ только к нумерации страниц и данным без субтитров.

Любая помощь и объяснение будут оценены по достоинству!

Спасибо!

Комментарии:

1. Я не уверен, что вам нужно. Что вы подразумеваете под «субтитрами»? GifSearchResult имейте только два свойства: data и pageInformation , итак, к каким другим данным вы хотели бы получить доступ? И с чем это связано @SerializedName ?

2. Я пытаюсь получить: @SerializedName(«url») значения

3. Вы имеете в виду только значения GifDetails.url свойств или также все Images.original.url , Images.fixedWidth.url , и т.д.? Вам нужен единый список всех этих URL-адресов?

4. Только GifDetails. url, извините за недоразумение.

Ответ №1:

Итак, мне удалось сделать это, запустив цикл:

                 for (i in 0 until responseObject.pageInformation.count) {

                   Log.e("Data",""   responseObject.data[i].images.downsized.url)

                }
 

Ответ №2:

Обычно в таких случаях мы используем map(), flatMap() или их комбинацию. Они берут коллекцию элементов и создают другую коллекцию путем сопоставления / преобразования каждого элемента в новое значение. В вашем случае это так просто, как:

 responseObject.data.map { it.url }
 

Если нам нужно игнорировать пустые URL-адреса ( "" ), мы можем дополнительно отфильтровать их:

 responseObject.data
    .map { it.url }
    .filter { it.isNotEmpty() }
 

В качестве альтернативы, мы можем сделать то же самое за один шаг:

 responseObject.data.mapNotNull { it.url.ifEmpty { null } }