如何使用Retrofit2获取的android中的JSON响应中的键中访问键的值?

时间:2018-09-02 15:52:40

标签: android json retrofit2

我正在访问WordPress API以使用Retrofit2来获取帖子,然后当我尝试将值分配给适配器中的视图时

inner class MainActivityViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    fun bind(post: Post) {
        with(post) {
            itemView.tv_post_title.text = title
            itemView.tv_post_date.text = date
            itemView.tv_post_content.text = content
        }
    }
}

翻新版的GET返回一个Observable,因此,在尝试分配时,在onErrorResumeNext中显示以下错误:

  

java.lang.IllegalStateException:预期为字符串,但在行1列373路径$ [0] .title处为BEGIN_OBJECT

这是因为title键中包含一个rendered键:

{  
  id:497,
  date:"2018-04-08T03:34:12",
  [...]
  title:{  
    rendered:"Lorem ipsum dolor sit amet"
  }
}

contentexcerpt也是如此。如何访问这些rendered的密钥?我尝试过类似的

  

val标题:JsonElement = JsonParser()。parse(post.title)

但相同的错误仍然存​​在。

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为json解析器无法解析标题对象。

  

java.lang.IllegalStateException:预期为字符串,但在行1列373路径$ [0] .title处为BEGIN_OBJECT

为避免此运行时错误,请click here to create java pojo for expected json,然后将其用作改装api中的返回类型。

尝试将以下java pojo用于使用上述工具创建的json。

Post.kt

data class Post(
    @PrimaryKey(autoGenerate = true)
    @SerializedName("id")
    val id: Int,

    @SerializedName("title")
    @Embedded
    val title: Title,

    @SerializedName("excerpt")
    @Embedded
    val excerpt: Excerpt,

    @SerializedName("content")
    @Embedded
    val content: Content,

    @SerializedName("date")
    val date: String,

    @SerializedName("modified")
    val modified: String
)

Content.kt

class Content {
    @SerializedName("rendered")
    var content: String? = null
}

Title.kt

class Title {
    @SerializedName("rendered")
    var title: String? = null
}

摘录.kt

class Excerpt {
    @SerializedName("rendered")
    var excerpt: String? = null
}

导入对Gson的依赖性

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
  

@SerializedName:提供使用名称不同于JSON密钥的java成员变量映射JSON密钥的功能。   Check this question