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 值的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle PL/SQL 中,如何检查 JSON 对象是不是包含特定键的元素

如何检查元素是不是包含特定的类属性

检查对象数组中是不是存在具有特定键值的对象

如何检查特定元素中是不是有值或其他类?

如何检查哈希中是不是存在特定键?

如何检查特定的 json 键是不是具有与所有键相同的值