#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 } }