在android中,如何访问使用2获取的JSON响应中键内键的值?
我正在访问WordPress API以使用Reformation2获取帖子,然后当我尝试将值分配给适配器中的视图时:在android中,如何访问使用2获取的JSON响应中键内键的值?,android,json,retrofit2,Android,Json,Retrofit2,我正在访问WordPress API以使用Reformation2获取帖子,然后当我尝试将值分配给适配器中的视图时: inner class MainActivityViewHolder(view: View) : RecyclerView.ViewHolder(view) { fun bind(post: Post) { with(post) { itemView.tv_post_title.text = title it
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
返回一个可观察的
,因此,当它尝试分配时,onErrorResumeNext
中显示以下错误:
java.lang.IllegalStateException:应为字符串,但在第1行第373列路径$[0]处为BEGIN_对象。标题
这是因为标题
键中有一个呈现的
键:
{
id:497,
date:"2018-04-08T03:34:12",
[...]
title:{
rendered:"Lorem ipsum dolor sit amet"
}
}
这同样适用于内容
和摘录
。如何访问这些渲染的s键?我试过类似的东西
val title:JsonElement=JsonParser().parse(post.title)
但同样的错误仍然存在。发生这种情况是因为json解析器无法解析title对象
java.lang.IllegalStateException:应为字符串,但在第1行第373列路径$[0]处为BEGIN_对象。标题
以避免此运行时错误,然后将其用作改装api中的返回类型
尝试为您的json使用以下JavaPOJO,该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键映射为具有不同于JSON键名称的java成员变量。
这是因为json解析器无法解析title对象
java.lang.IllegalStateException:应为字符串,但在第1行第373列路径$[0]处为BEGIN_对象。标题
以避免此运行时错误,然后将其用作改装api中的返回类型
尝试为您的json使用以下JavaPOJO,该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键映射为具有不同于JSON键名称的java成员变量。
请添加您的代码。进行了一些更改。请添加您的代码。进行了一些更改。嘿,这确实有帮助。但这会导致另一个问题。由于我有多个字段的子关键字为rendered
,如果将许多@Embedded类命名为rendered
,它会抱怨说“多个字段具有相同的列名:rendered”。以不同方式重命名它们不会读取该值。请提供有关错误的更多详细信息以及您尝试解析的示例json?该问题与标题:{rendered:“foo”}
,但还有另外两个键,其中rendered
,content
和extract
,这会导致错误错误:(8, 8)错误:多个字段具有相同的列名:rendered。字段名:title>rendered,content>rendered,extract>rendered。
。我找到了附加前缀的解决方案,但在本例中,它们正在创建JSON格式,在本例中,我获取一种已定义的格式,并且不会显示与rendered
不同的名称任何内容。如果您想查看JSON:@gamofe,请检查编辑的答案。如果您想操作JSON映射,请使用Gson或任何其他类似的解析器。由于映射变量不同于JSON键,因此错误应该消失。使用Gson的SerializedName
解决了这个问题。您只需在答案中编辑一件事:var的名称其他3个类中的变量不能相同,只有序列化名称应该是呈现的
。嘿,这确实有帮助。但它导致了另一个问题。因为我有多个字段具有呈现的
作为子关键字,如果将许多@Embedded类命名为呈现的
,它会抱怨说“多个字段具有相同的columnName:rendered”。以不同方式重命名它们将不会读取该值。您能否提供有关错误的详细信息以及您试图解析的json示例?问题就像标题:{rendered:“foo”}}
,但是还有另外两个键,内容和摘录,里面有呈现的,这会导致错误错误:(8,8)错误:多个字段具有相同的列名:rendered。字段名:title>rendered,content>rendered,extract>rendered。
。我找到了附加前缀的解决方案,但在本例中,它们正在创建JSON格式,在本例中,我获取一种已定义的格式,并且不会显示与rendered
不同的名称任何内容。如果您想查看JSON:@gamofe,请检查编辑的答案。如果您想操作JSON映射,请使用Gson或任何其他类似的解析器。由于映射变量不同于JSON键,因此错误应该消失。使用Gson的SerializedName
解决了这个问题。您只需在答案中编辑一件事:var的名称其他3个类中的变量不能相同,只有序列化的名称应呈现
。