【问题标题】:Retrofit and Moshi: parsing variable name objectsRetrofit 和 Moshi:解析变量名对象
【发布时间】:2018-07-26 23:51:00
【问题描述】:

我正在使用 Retrofit 2 和 Moshi 从端点读取和解析 JSON。我的改造实例是这样定义的:

val retrofit: Retrofit = Retrofit.Builder()
       .baseUrl("https://myendpoint.com")
       .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
       .addConverterFactory(MoshiConverterFactory.create())
       .build()

我正在使用 Kotlin 数据类将信息存储在模型中:

@GET("data/getlist")
fun getData(): Single<Data>

数据类:

data class Data(val Response : String,
            val Message : String,
            val BaseImageUrl : String)

现在,因为 JSON 是这样格式化的,所以解析 JSON 并很好地填充模型:

{
    "Response": "Success",
    "Message": "Api successfully returned",
    "BaseImageUrl": "https://www.endpoint.com/image/xxx.jpg",
}

这是因为对象与模型 1:1 映射。所以在上面的例子中,“Response”键映射到Data类中的“Response”变量名。

我的问题是:如果键都是可变的怎么办?您如何在 Kotlin 数据类中表示这一点?

要解析的示例 JSON 文件:

{
    "RandomX": "xxxxxx",
    "RandomY": "yyyyyy",
    "RandomZ": "zzzzzz",
}

【问题讨论】:

  • 如果您的密钥可以是任何东西,我建议您将模型设为Map&lt;String, String&gt;
  • 也就是说,您的改造服务调用将返回一个Single&lt;Map&lt;String, String&gt;&gt;
  • 正确。那么我将如何在我的数据类中表示它呢?数据类 Data(val ??>: Map)
  • 啊,我想得太复杂了。当它最终只是一个 Map 时,不需要自定义数据类。谢谢埃里克! (我会将此标记为已接受的答案,但我想您不能在 cmets 上这样做:/)
  • 您可能必须在 Kotlin 中使用 @JvmSuppressWildcards。 Kotlin 可能会尝试将 String 转换为 ? extends String。不过,希望它不会考虑到 String 是最终类型。

标签: android kotlin retrofit retrofit2 moshi


【解决方案1】:

正如@eric-cochran 指出的那样,您实际上并不需要一个新的数据类来表示这一点。它最终会成为一个地图,你会像这样使用它:

@GET("data/getlist")
fun getVariableData(): Single<Map<String, String>>

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 2021-08-24
    • 1970-01-01
    • 2020-02-10
    • 2020-07-16
    • 2021-02-03
    • 2021-04-24
    • 2023-04-01
    • 2019-04-20
    相关资源
    最近更新 更多