How can I Serialize/De-serialize a Boolean Value from FasterXML\Jackson as an Int?
As Paulo Pedroso's answer mentioned and referenced, you will need to roll your own custom JsonSerializer
and JsonDeserializer
. Once created, you will need to add the @JsonSerialize
and @JsonDeserialize
annotations to your property; specifying the class to use for each.
I have provided a small (hopefully straightforward) example below. Neither the serializer nor deserializer implementations are super robust but this should get you started.
public static class SimplePojo { @JsonProperty @JsonSerialize(using=NumericBooleanSerializer.class) @JsonDeserialize(using=NumericBooleanDeserializer.class) Boolean bool;}public static class NumericBooleanSerializer extends JsonSerializer<Boolean> { @Override public void serialize(Boolean bool, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException { generator.writeString(bool ? "1" : "0"); } }public static class NumericBooleanDeserializer extends JsonDeserializer<Boolean> { @Override public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException { return !"0".equals(parser.getText()); } }@Testpublic 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\"}"));}
Instead of custom deserializer, you could also simply have a setter like:
public void setThisIsABoolean(String str) { if ("0".equals(str)) { bool = false; } else { bool = true; }}
since your method can claim different type than what you use internally.
And if you have to support both Boolean
and String
, you can indicate value is an Object
, and check what you might get.
It should even be possible to have different type for getter method (Boolean
) and setter (String
or Object
).