GSON 不解析布尔值(始终为假)

Posted

技术标签:

【中文标题】GSON 不解析布尔值(始终为假)【英文标题】:GSON not parsing booleans (always false) 【发布时间】:2016-10-09 16:24:38 【问题描述】:

我正在使用 Retrofit 来获取 JSON 文档。问题是,所有布尔值总是错误的。

响应如下所示:


   "gender":[0,1],
   "age":[20,30],
   "likesLeaveHome":false,
   "likesSport":false,
   "likesCulture":false,
   "likesTraveling":false
   ...

我用

调用改造方法
onResponse(Call<SearchProfile> call, Response<SearchProfile> response)

并且应该将响应解析为的 SearchProfile 类如下所示:

public class SearchProfile 

    public ArrayList<Integer> gender = new ArrayList<>(); // works fine
    public ArrayList<Integer> age    = new ArrayList<>(); // works fine

    ...

    public Boolean likesLeaveHome = true;    // always false

    @SerializedName("likesSport")
    public boolean likesSport     = true;    // always false

    @SerializedName("likesCulture")
    public Boolean likesCulture;             // always false

    @SerializedName("likesTraveling")
    public Boolean mLikesTraveling;          // always false

    public boolean isLikesTraveling() 
        return mLikesTraveling;
    

    public void setLikesTraveling(boolean likesTraveling) 
        mLikesTraveling = likesTraveling;
    


如您所见,它是一个简单的 pojo 类。像“性别”和“年龄”这样的列表工作得很好。尽管如此,布尔值仍无法设置。 (这特别奇怪,因为通过 Retrofit 发送这个对象发送的正是这个文档,所以 GSON 肯定知道布尔值)。

如截图所示,我还尝试了其他方法,例如将 Boolean 包装类作为类型而不是布尔值。 我还使用了 @SerializeName 注释或 getter 和 setts 方法等。 仍然所有布尔值总是错误的。即使我将它们默认为 true(所以 GSON 似乎总是用 false 覆盖这个值)。

希望有人有一个好主意!

【问题讨论】:

你用的是什么版本?我试过“2.6.2”,效果很好。 "com.google.code.gsongson2.6.2" 嗯,我使用的是改造框架中的内部版本,但据我所知这是 2.6.2。 我还在等待解决方案@TobiasReich 好吧,我已经有一段时间没有解决这个问题了,但到目前为止它似乎现在可以工作了。我不确定他们是否更改了 API 中的某些内容。我现在正在使用改造 2.1.0。也许这就是解决方案。如果我有时间,我会给出答案。 遇到同样的问题:/ 【参考方案1】:

您在示例中解析的 JSON 的所有值都为 false。解析时,GSON 将使用反射覆盖类的字段值,这意味着从 JSON 解析的任何值都将是该字段的值,无论它在类中如何初始化。

这是一个示例响应,它将导致字段设置为 true。同样,这取决于您要解析的任何 JSON。


   "gender":[0,1],
   "age":[20,30],
   "likesLeaveHome":true,
   "likesSport":true,
   "likesCulture":true,
   "likesTraveling":true
   ...

【讨论】:

以上是关于GSON 不解析布尔值(始终为假)的主要内容,如果未能解决你的问题,请参考以下文章

为啥当值为假时我不能传递过滤数据(它是布尔值)

布尔标志始终为假

将布尔值设置为假是多余的吗?

GSON将布尔值序列化为0或1

Python第七天_布尔值的应用

如果数组中的所有值都为真(字符串)并且其中一个值为假(字符串),则如何返回布尔值 true 停止使用 Javascript 进行检查