当前位置:  开发笔记 > 编程语言 > 正文

如何从FasterXML\Jackson序列化/反序列化布尔值作为Int?

如何解决《如何从FasterXML\Jackson序列化/反序列化布尔值作为Int?》经验,为你挑选了1个好方法。



1> callmepills..:

正如保罗佩德罗索的答案所提及和引用的那样,你需要自己定制JsonSerializer和自定义JsonDeserializer.创建后,您需要在属性中添加@JsonSerialize@JsonDeserialize注释; 指定要用于每个的类.

我在下面提供了一个小的(希望直截了当的)示例.串行器和解串器实现都不是非常强大,但这应该可以帮助您入门.

public static class SimplePojo {

    @JsonProperty
    @JsonSerialize(using=NumericBooleanSerializer.class)
    @JsonDeserialize(using=NumericBooleanDeserializer.class)
    Boolean bool;
}

public static class NumericBooleanSerializer extends JsonSerializer {

    @Override
    public void serialize(Boolean bool, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException {
        generator.writeString(bool ? "1" : "0");
    }   
}

public static class NumericBooleanDeserializer extends JsonDeserializer {

    @Override
    public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
        return !"0".equals(parser.getText());
    }       
}

@Test
public void readAndWrite() throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();

    // read it
    SimplePojo sp = mapper.readValue("{\"bool\":\"0\"}", SimplePojo.class);
    assertThat(sp.bool, is(false));

    // write it
    StringWriter writer = new StringWriter();
    mapper.writeValue(writer, sp);
    assertThat(writer.toString(), is("{\"bool\":\"0\"}"));
}


实际上你不需要Deserializer:Jackson会自动将0/1反序列化为布尔POJO属性,而不需要任何注释.在我的事件中,我也不需要Serializer,因为我正在调用的服务器正在接受并转换此字段的真/假文字.无论如何,我正在给予赏金.
@AndrewSpencer谢谢,我很欣赏这个奖项.:)要明确的是,杰克逊似乎会自动反序列化该属性,如果它作为**数字**而不是**字符串**.
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有