首页 文章

使用Jackson解析json中的布尔值时的额外数据

提问于
浏览
2

当我使用Jackson解析JSON中的布尔值时,我不仅获得了我期望的数据,还获得了额外的键值数据 . 我想将JSON反序列化为Java Bean,然后在处理之后再将其序列化为String . 额外的数据在最终结果中 . 这是我的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 .

我怎么解决这个问题?谢谢!

3 回答

  • 2

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

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

    结果:

    {"is_charging": true}
    
  • 0

    导致该问题的是 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); . 如果您需要,可提供其他参考 .

  • 0

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

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

    disable(MapperFeature.AUTO_DETECT_IS_GETTERS);
    

    这是ObjectMapper类中的方法

相关问题