【问题标题】:Moshi and Retrofit2: Unable to read service responseMoshi 和 Retrofit2:无法读取服务响应
【发布时间】:2020-04-09 00:11:51
【问题描述】:

我正在尝试从 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
)

但我很想知道它为什么有效。

【问题讨论】:

  • 因为你没有用正确的json 命名标记rsp
  • 对不起,这是一个 Typo 错误,json 元素和相关类具有相同的命名
  • 哦,比你不需要任何答案吗?在这种情况下,您可以关闭它,或者直接删除它。
  • 不,我仍然需要一个答案,我总是得到空字段(我刚刚用正确的类命名编辑了我的问题)。
  • 能否请您添加您正在使用的moshi的依赖项?

标签: android kotlin retrofit2 moshi


【解决方案1】:

试试这个模型,让我知道它是否有效:

@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

【讨论】:

  • 我总是得到空响应字段
  • @giozh 准确配置,联网,尝试获取这个jsonplaceholder.typicode.com/albums,看看能不能获取数据;;;并确保您在没有 proguard 的调试版本变体中遇到此问题,并且 R8 已禁用;;;确保.add(KotlinJsonAdapterFactory()) 是最后添加的适配器;;; O或使用codegen:@JsonClass(generateAdapter = true)
  • 我找到了一个解决方案,我认为是关于 Kotlin 上的 Moshi 和 @Json 注释(在我的其他项目中,我不在字段上使用注释,因为它们没有“@”在开始)。我用找到的解决方案编辑我的问题。
  • @giozh 你需要添加moshi-kotlin 依赖并添加这个.add(KotlinJsonAdapterFactory())。然后moshi 不能忽视@Json。但感谢分享该解决方案
【解决方案2】:

@field:Json 是必需的,如果您希望 moshi-kotlin 根据此处的讨论与 proguard 一起工作:https://github.com/square/moshi/issues/315

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 2012-12-07
    • 2020-05-19
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2021-05-26
    相关资源
    最近更新 更多