【发布时间】: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<String, String>。 -
也就是说,您的改造服务调用将返回一个
Single<Map<String, String>>。 -
正确。那么我将如何在我的数据类中表示它呢?数据类 Data(val ??>: Map
) -
啊,我想得太复杂了。当它最终只是一个 Map
时,不需要自定义数据类。谢谢埃里克! (我会将此标记为已接受的答案,但我想您不能在 cmets 上这样做:/) -
您可能必须在 Kotlin 中使用
@JvmSuppressWildcards。 Kotlin 可能会尝试将 String 转换为? extends String。不过,希望它不会考虑到 String 是最终类型。
标签: android kotlin retrofit retrofit2 moshi