android - 如何通过地图作为使用 Retrofit2 的参数?
问题描述
我需要Map<String, Any>
作为 PUT 请求的参数传递。Json(由 Map 制成)如下所示:
{
"user": {
"lastname": "Smith",
"name": "John",
...
},
"foreign_language_keys": [
"eng",
"fr"
],
"tachograph_cards": [
{
"tachograph_key": "estr",
"tachograph_card_num":
.....
Map<String, String>
如果我作为参数传递- 它工作正常:
@FormUrlEncoded
@Headers("Content-Type: application/json")
@PUT("api/authorization/user/driver/{user_id}")
fun editUser(@Path("user_id") userId: String, @FieldMap body: Map<String, String>): Single<UserModel>
但是如果我需要Map<String, Any>
作为参数传递 - 我会收到运行时错误“java.lang.IllegalArgumentException:参数类型不能包含类型变量或通配符:java.util.Map(参数#2)”
添加 @JvmSuppressWildcards 注释 ( @FieldMap body: Map<String, @JvmSuppressWildcards Any>)
) 没有帮助(我从服务器收到另一个错误“未定义索引”,用于 Json 中的一个必要字段,因为服务器在我的请求中看不到此字段)。
可行的解决方案是通过映射我模型中的所有字段(而不是通过Map<String, Any>
)来制作 com.google.gson.JsonObject ,但这太难了。我确信它必须在不将我的模型转换为 Json 的情况下工作,但我找不到简单的解决方案。有人能帮忙吗?
解决方案
我最近遇到了同样的问题,我发现可能是最简单的解决方案。您可以在此处查看我对类似问题的完整答案:https ://stackoverflow.com/a/61324340/7110268
在您的特定情况下,您可以尝试以下操作:
val body = mutableMapOf<String, String>()
body["user[lastname]"] = "Smith"
body["user[name]"] = "John"
body["foreign_language_keys[0]"] = "eng"
body["foreign_language_keys[1]"] = "fr"
// and so on
例如,如果您需要传递一个巨大的动态列表,您可以轻松地在for
循环中填充您的地图。
推荐阅读
- ruby-on-rails - logstash 更改类型格式
- kotlin - Java 堆空间 kotlin 和 IntelliJ
- nginx - 没有定义解析器来解析谷歌云上 nginx 中的 myipp.com
- go - influxDBv1.8如何使用golang API判断数据库是否存在?
- python - MySQLdb._exceptions.OperationalError: (2006, '') 使用 mysqlclient 2.0.3 关闭 SQL 查询时。是因为连接吗?
- c# - 如何将对象序列化为 XML C# webapi
- python - 如何使用 Django 和 Python 3 创建和压缩多个文件并下载它们
- reactjs - 如何用玩笑模拟 ES6 模块中的变量,以便实际函数以模拟值运行
- sql - 用 Postgres 中的默认值替换结果集中的时间间隔
- apache - mod_rewrite规则中的@符号是什么意思