为 Gson 数据设置 Dynamic SerializedName 注释 class

Set Dynamic SerializedName annotation for Gson data class

我通过 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"
    }
  }
}

这是我的数据class:

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,使其在每次上传时都是唯一值?

您需要将数据解析为 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
)

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