【问题标题】:extra data while parsing boolean value in json by using Jackson使用 Jackson 解析 json 中的布尔值时的额外数据
【发布时间】:2015-12-18 05:15:08
【问题描述】:

当我使用 Jackson 解析 JSON 中的布尔值时,我不仅获得了预期的数据,还获得了额外的键值数据。我想将 JSON 反序列化为 Java Bean,然后在处理后再次将其序列化为字符串。额外的数据在最终结果中。这是我的 JSON 数据:

{"is_charging": true}

但是我在解析它然后序列化它之后得到这个:

{"is_charging": true, "charging": true}

这是我的 Java bean:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Data {
    @JsonProperty("is_charging")
    public boolean isCharging; 
}

但是,如果我不使用@JsonProperty,它不能反序列化“is_charging”,默认反序列为false。

我该如何解决这个问题?谢谢!

【问题讨论】:

    标签: java json serialization jackson boolean


    【解决方案1】:

    lombok.Getterlombok.Setter 注释导致了问题。

    public class Data {
        @JsonProperty("is_charging")
        public boolean isCharging; 
    }
    
    objectMapper.writeValueAsString(new Data());
    

    按预期工作。

    添加@Getter和@Setter注解时出现问题。

    我没有使用此 lombok 库的经验,但据我了解,它为您创建了 getter 和 setter 方法。

    通过配置 objectMapper,您可以禁用 getter 和 setter 方法的自动检测,因此只有字段可以被序列化和反序列化。

    @Getter
    @Setter
    public class Data {
    
        @JsonProperty("is_charging;")
        public boolean isCharging;
    
    }
    
    public static void main(String... args) throws JsonProcessingException, IOException {
    
        ObjectMapper objectMapper = new ObjectMapper();
    
        objectMapper.configure(MapperFeature.AUTO_DETECT_GETTERS, false);
        objectMapper.configure(MapperFeature.AUTO_DETECT_IS_GETTERS, false);
        objectMapper.configure(MapperFeature.AUTO_DETECT_SETTERS, false);
    
        Data data = objectMapper.readValue("{\"is_charging\": true}", Data.class);
    
        System.out.print(objectMapper.writeValueAsString(data));
    }
    

    输出:

    {"is_charging":true}
    

    请注意,您的情况只需要objectMapper.configure(MapperFeature.AUTO_DETECT_IS_GETTERS, false);。其他的仅供参考,以备不时之需。

    【讨论】:

      【解决方案2】:

      可以通过将属性名称从 isCharging 更改为 charging

      @Getter
      @Setter
      public class Data {
          @JsonProperty("is_charging")
          public boolean charging; 
      }
      

      结果:

      {"is_charging": true}
      

      【讨论】:

        【解决方案3】:

        AUTO_DETECT_IS_GETTERS 是一个映射器功能,用于确定是否根据标准 Bean 命名约定自动检测“is getter”方法。如果是,则所有以前缀“is”开头且返回类型为布尔值的公共零参数方法都被视为“is getter”。如果禁用,则只有显式注释的方法才被视为 getter。

        默认情况下启用该功能。您可以在配置对象映射器时禁用它。使用,

        disable(MapperFeature.AUTO_DETECT_IS_GETTERS);
        

        ObjectMapper 类中的方法

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 2013-04-29
          • 2023-03-13
          • 1970-01-01
          相关资源
          最近更新 更多