Moshi和Retrofit2:无法读取服务响应

时间:2019-12-16 14:00:26

标签: android kotlin retrofit2 moshi

我正在尝试从Web服务读取json响应,但未成功。 这是我收到的json:

{
  "rsp": {
          "@code": "0",
          "@message": ""
       },
  "listOfStrings":[]
}

这是我解析响应的相对数据类

data class Response(
    val rsp : Rsp,
    val listOfStrings : List<String>
)

data class Rsp(
    @Json(name = "@code")
    val code : String,
    @Json(name = "@message")
    val message : String
)

但是,由于某些原因,moshi似乎无法将json解析为对象,因为我总是获得带有所有空字段的Response对象。

那怎么了? json响应字段的“ @”字符可能会引起问题吗?

更新

现在我可以通过将@Json批注更改为@field:Json来正确解析响应:

data class Rsp(
    @field:Json(name = "@code")
    val code : String,
    @field:Json(name = "@message")
    val message : String
)

但是我很好奇它为什么起作用。

2 个答案:

答案 0 :(得分:0)

尝试此模型,让我知道它是否有效:

@Parcelize
data class Response(
    @Json(name = "rsp")
    val rsp: Rsp,
    @Json(name = "listOfStrings")
    val listOfStrings: List<String>
) : Parcelable {
    @Parcelize
    data class Rsp(
        @Json(name = "@code")
        val code: String,
        @Json(name = "@message")
        val message: String
    ) : Parcelable
}

编辑: 如果不起作用,请尝试在具有@的字段名称后面添加反斜杠。

就像:@Json(name = "\@code")

问题后的更新:
您需要添加moshi-kotlin依赖项,然后使用KotlinJsonAdapterFactory

val moshi = Moshi.Builder()
    // ... add your own JsonAdapters and factories ...
    .add(KotlinJsonAdapterFactory())
    .build()

然后moshi无法忽略@Json

答案 1 :(得分:0)

@field:根据以下讨论,如果您希望moshi-kotlin与proguard一起工作,则必须使用Json:https://github.com/square/moshi/issues/315