首页 > 解决方案 > 为 Gson 数据类设置 Dynamic SerializedName 注解

问题描述

我通过 Retrofit 从 API 调用返回的响应对每个对象都有一个动态值。我需要能够在每次调用时编辑 @SerializedName 注释中的值。这是 JSON 响应:

{
  "data": {
    "/storage/emulated/0/DCIM/Camera/IMG_20190920_110850.jpg": {
      "id": "4f7e74d1-afa8-4924-a8ab-ea9360400b",
      "location": "279dbcd7666b/4f7e74d1-afa8-4924-a8ab-ea9360400b.jpg",
      "bucket": "challenge-submit"
    }
  }
}

这是我的数据类:

data class UploadLinksResponse(
    @SerializedName("data")
    val data: UploadData
)

data class UploadData(
    @SerializedName("/storage/emulated/0/DCIM/Camera/IMG_20190920_110850.jpg")
    val media: MediaLink
)

data class MediaLink(
    @SerializedName("id")
    val id: String,
    @SerializedName("bucket")
    val bucket: String,
    @SerializedName("location")
    val uploadLocation: String
)

如何为 MediaLink 对象设置 SerializedName,每次上传时它都是唯一值?

标签: androidgsonretrofit2

解决方案


您需要将数据解析为 Map,下面的代码可以帮助您。

data class UploadLinksResponse(
    @SerializedName("data")
    @Expose 
    val data: Map<String, MediaLink>
)


data class MediaLink(
    @SerializedName("id")
    val id: String,
    @SerializedName("bucket")
    val bucket: String,
    @SerializedName("location")
    val uploadLocation: String
)

因此您将能够以地图的形式获取数据,然后您的动态数据将成为键,相关数据将作为该键的值,然后您需要使用迭代器根据键的值从键和值中获取数据。


推荐阅读