【问题标题】:Gson deserialize boolean from 1 to false in JAVA AndroidGson在JAVA Android中将布尔值从1反序列化为false
【发布时间】:2016-09-12 17:54:55
【问题描述】:

我使用的类如下:

public class TheJob {       
    private String jobDescription = null, jobAdditionalInfo = null, jobAddress = null;

    @SerializedName("jobActive")
    public boolean jobActive = true;

    @SerializedName("offsiteAllowed")
    public boolean offsiteAllowed;
}

我收到的 JSON 如下:

[{"jobId":"2","jobDescription":"Beta","jobAdditionalInfo":"Edited ","jobAddress":"103 Emus Avenue \nCenturion \n0157 \nSouth Africa \n","jobActive":"1","offsiteAllowed":"1"}]

我删除了其余的 JSON 数组项,因为它们完全相同。

我无法正确解析布尔字段 jobActive 和 offsiteAllowed,即使 JSON 值为 1,它们也总是解析为 false。

除了布尔值之外,我的 TheJob 类中的所有其他内容都可以完美地反序列化

任何建议将不胜感激。

【问题讨论】:

标签: java android json gson


【解决方案1】:

Gson 非常注重类型。要将 int 值解析为布尔值,您可能必须注册一个自定义布尔反序列化类。或者,如果您控制 api 更改返回 true 而不是 1。它期待“true”并将其他所有内容视为 false。应该有一些注册自定义 JsonDeserializer 类的示例。这个适配器允许你做一些事情,比如反序列化为一个名为 isFruit 的布尔变量,并从 API 返回 Apple、Orange、Carrot 等。注册后,您可以实现自定义反序列化器来评估值并根据需要将 true 和 false 反序列化为 isFruit。

【讨论】:

    【解决方案2】:

    实现这一点的最简单方法(手动)是自己检查和更改数据。我通常在这样的 Util 类中创建静态方法:

    parseTypedBoolean(JsonObject obj, String... keys);
    

    这使得解析所有保存为 0 和 1 的布尔值变得容易。

    for (String key : keys) {
        if (obj.getInt(key) == 1) {
            obj.put(key, true);
        } else obj.put(key, false);
    }
    

    每次获取数据后:

    JSONObject curr = response.getJSONObject(i);
    toBoolean(curr, "is_available", "is_new", "is_parsed", "is_registered" ,...);
    

    您可以为这些常用键设置一个枚举。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多