Android 如何通过Map<;字符串,任意>;使用2作为参数?

Android 如何通过Map<;字符串,任意>;使用2作为参数?,android,kotlin,retrofit2,Android,Kotlin,Retrofit2,我需要传递Map作为PUT请求的参数。Json(由地图制成)如下所示: { "user": { "lastname": "Smith", "name": "John", ... }, "foreign_language_keys": [ "eng", "fr" ], "tachograph_cards": [ { "tachograph_key": "estr", "tachograph_card_num

我需要传递
Map
作为PUT请求的参数。Json(由地图制成)如下所示:

{
  "user": {
    "lastname": "Smith",
    "name": "John",
    ...
  },
  "foreign_language_keys": [
    "eng",
    "fr"
  ],
  "tachograph_cards": [
    {
      "tachograph_key": "estr",
      "tachograph_card_num":
      .....
如果我将
Map
作为参数传递-它工作正常:

@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>
@FormUrlEncoded
@标题(“内容类型:application/json”)
@PUT(“api/authorization/user/driver/{user\u id}”)
fun editUser(@Path(“user_id”)userId:String,@FieldMap body:Map):单个
但是如果我需要将
Map
作为参数传递,我会得到运行时错误“java.lang.IllegalArgumentException:参数类型不能包含类型变量或通配符:java.util.Map(参数#2)”

添加@JvmSuppressWildcards注释(
@FieldMap body:Map)
)没有帮助(对于Json中的一个必要字段,我从服务器获得另一个错误“未定义索引”,因为服务器在我的请求中没有看到此字段)

工作解决方案是通过映射我的模型中的所有字段(而不是传递
Map
)来生成com.google.gson.JsonObject,但这太难了。我确信它必须在不将我的模型转换为Json的情况下工作,但我找不到简单的解决方案。
有人能帮上忙吗?

您的JSON结构看起来怪异且不一致。通过结构进行改造时,需要定义清晰一致的结构。在您的例子中,map键看起来总是字符串,但map的值部分有时是Json对象,有时是数组/列表或其他。不一致,因此无法精确确定结构值


你肯定不能发布/放置
Map我最近也遇到了同样的问题,我可能找到了最简单的解决方法。
你可以在这里查看我对类似问题的完整答案:

在您的特定情况下,您可以尝试以下方法:

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
val body=mutableMapOf()
正文[“用户[姓氏]”]=“史密斯”
正文[“用户名]”]=“约翰”
正文[“外语键[0]”]=“英语”
正文[“外语键[1]”]=“fr”
//等等

例如,如果您需要传递一个巨大的动态列表,您可以轻松地在
for
循环中填充地图

它必须是作为委托属性的可变变量。能够惩罚你们想要安置在任何地方的财产

您的解决方案是放置可变映射

interface MutableMap<K, V> 
    
V the type of map values. The mutable map is invariant in its value type.

interfaceMap<K, V> 
    
V the type of map values. The map is covariant in its value type.


@FormUrlEncoded
@Headers("Content-Type: application/json")
@PUT("api/authorization/user/driver/{user_id}")
fun editUser(@Path("user_id") userId: String, @FieldMap body: MutableMap<String, String>): Single<UserModel>
接口可变映射
V映射值的类型。可变映射的值类型不变。
接口映射
V映射值的类型。贴图的值类型是协变的。
@FormUrlEncoded
@标题(“内容类型:application/json”)
@PUT(“api/authorization/user/driver/{user\u id}”)
fun editUser(@Path(“user_id”)userId:String,@FieldMap body:MutableMap):单个

这不是一个正确的答案,请详细说明如何解决OP的问题。