Android POJO 类检查特定键是不是包含 Boolean 或 arraylist 值
Posted
技术标签:
【中文标题】Android POJO 类检查特定键是不是包含 Boolean 或 arraylist 值【英文标题】:Android POJO class check if particular key contains value as Boolean or arraylistAndroid POJO 类检查特定键是否包含 Boolean 或 arraylist 值 【发布时间】:2021-10-23 13:57:57 【问题描述】:我有 JsonArraylist,其中有多个 jsonobjects。在其中一个 jsonObject json 键包含布尔值,而在其他 Jsonobject 上,相同的键包含 ArrayList。 如果键包含 ArrayList 或布尔值,如何检查 POJO 类,因为我收到错误:
W/System.err: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 预期 BEGIN_ARRAY 但在第 1 行第 1 列 1927 路径 $1.tags 处为 BOOLEAN
Json 是:
我的 POJO 课程是:
public class Posts implements Serializable
String id;
String title;
boolean mIsBookmark;
ArrayList<WebTags>tags;
public ArrayList<WebTags> getTags()
return tags;
public void setTags(ArrayList<WebTags> tags)
this.tags = tags;
public String getId()
return id;
public void setId(String id)
this.id = id;
public String getTitle()
return title;
public void setTitle(String title)
this.title = title;
public String getDate()
return date;
public void setDate(String date)
this.date = date;
public boolean isBookmark()
return mIsBookmark;
public void setBookmark(boolean mIsBookmark)
this.mIsBookmark = mIsBookmark;
@Override
public String toString()
return "Webapps_post" +
"id='" + id + '\'' +
", title='" + title + '\'' +
", date='" + date + '\'' +
", tags='"+ tags+'\'' +
'';
public class WebTags implements Serializable
String term_id;
String name;
public String getTerm_id()
return term_id;
public void setTerm_id(String term_id)
this.term_id = term_id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String toString()
return "WebTags"+
"term_id='" + term_id + '\'' +
", name='" + name + '\'' +
'';
【问题讨论】:
即使有可能(可能使用自定义反序列化器),“true”对标签意味着什么?如果真永远不会发生,为什么不给一个空数组而不是“假”。也许您应该首先将数据作为字符串获取,然后将“tags:false”替换为“tags:[]”... 【参考方案1】:TypeAdapter
正是您正在寻找的。总而言之,您可以为用户定义的数据类型(例如 class
)添加自定义转换逻辑,并且 Gson 序列化器/反序列化器足够智能,可以根据转换方法的返回类型来执行此操作
用法示例见here
【讨论】:
【参考方案2】:您需要为Posts
类创建一个自定义反序列化器,如下所示:
class PostsDeserializer : JsonDeserializer<Posts>
@Throws(JsonParseException::class)
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Posts
val finalResult = Posts()
// manually set all elements (except 'tags') to finalResult object.
//...
// set tags element now
val tagsElement = json.asJsonObject.get("tags")
if(tagsElement?.isJsonArray == true)
finalResult.tags = context.deserialize(tagsElement, WebTags::class.java)
else
finalResult.tags = emptyList()
return finalResult
上面的代码会告诉 GSON 库当 tags 字段是一个数组或者 tags 字段是一个布尔值时映射什么。
【讨论】:
此代码的放置位置以及如何调用标签以使用此代码获取价值。截至目前,我正在调用标签:final Webapps_post model = mRecentPostList.get(position); String tagName=model.getTags().get(0).getName();
以上是关于Android POJO 类检查特定键是不是包含 Boolean 或 arraylist 值的主要内容,如果未能解决你的问题,请参考以下文章