获取 SerializedName 值

Posted

技术标签:

【中文标题】获取 SerializedName 值【英文标题】:Get SerializedName Values 【发布时间】:2021-12-15 14:57:50 【问题描述】:

我开始学习 kotlin,需要一些帮助。

所以我的问题是如何获得我在另一个类中定义的序列化名称?

我正在使用这一行来获取所有数据:

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=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tnd&rid=giphy.gif&ct=g, size=194803, mp4Url=https://media0.giphy.com/media/13Cmju3maIjStW/giphy.mp4?cid=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tnd&rid=giphy.mp4&ct=g, mp4Size=52101, webpUrl=https://media0.giphy.com/media/13Cmju3maIjStW/giphy.webp?cid=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tnd&rid=giphy.webp&ct=g, webpSize=115414), fixedWidth=Urls(width=200, height=149, url=https://media0.giphy.com/media/13Cmju3maIjStW/200w.gif?cid=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tnd&rid=200w.gif&ct=g, size=47897, mp4Url=https://media0.giphy.com/media/13Cmju3maIjStW/200w.mp4?cid=8d79dd67s0dkoxp1m53kmunlydxrnnuijiv917zp7qdr6tnd&rid=200w.mp4&ct=g..............

我只需要网址,不需要其他任何东西。

这是 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 = ""
        )

    


我只能访问分页和数据,没有字幕。

任何帮助和解释将不胜感激!

谢谢!

【问题讨论】:

我不确定您需要什么。 “字幕”是什么意思? GifSearchResult 只有两个属性:datapageInformation,那么您还想访问哪些其他数据?和@SerializedName有什么关系? 我正在尝试获取:@SerializedName("url") 值 您是指GifDetails.url 属性的值还是所有Images.original.urlImages.fixedWidth.url 等的值?您需要所有这些 url 的平面列表吗? 只有 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  

【讨论】:

以上是关于获取 SerializedName 值的主要内容,如果未能解决你的问题,请参考以下文章

php serialize的长度问题,大神来

改造服务器响应的默认值显示为空。

kotlinx.serialization :如何解析为与 JSON 键的确切名称不同的变量名称

@SerializedName注解

Gson @SerializedName注解使用说明

实体类属性名字不规范用啥注解改