Hi! It has been a while since I have added a new foundational
functional, especially something related to bigger efforts, JSTEPs
(
https://github.com/FasterXML/jackson-future-ideas/wiki/JSTEP).
But today I wanted to share my recent work on JSTEP-7
(
https://github.com/FasterXML/jackson-future-ideas/wiki/JSTEP-7).
Basically, it is now possible to easily add new set of core on/off
feature flags -- not unlike DeserializationFeature,
SerializationFeature, wrt changing, checking etc -- but that apply to
a tighter set of things: to one specific class of datatypes.
This work was done under issue DB#3405:
https://github.com/FasterXML/jackson-databind/issues/3405
----
Now, to give an actual idea of what this means, consider something I
completed today: addition of "JsonNodeFeature" -- something that
changes how "tree values" (JsonNode) are read and written -- along
with the very first concrete feature flag,
JsonNodeFeature.READ_NULL_PROPERTIES
https://github.com/FasterXML/jackson-databind/issues/3421
By default this is enabled, so JSON like:
{ "value" : null }
will be represented, when read, as an `ObjectNode` with one property,
with key of "value", value of `NullNode`.
But if this feature is disabled like so:
ObjectMapper noNullsMapper = JsonMapper.builder()
.disable(JsonNodeFeature.READ_NULL_PROPERTIES)
.build();
// or
ObjectReader r = mapper.without(JsonNodeFeature.READ_NULL_PROPERTIES);
result would be same as if reading JSON like:
{ }
-----
Ok so why is this a big deal? Because from implementation perspective,
adding new Enum values in `JsonNodeFeature` or `EnumFeature` is very
simple; and checking value from deserializer/serializer is as simple
as (this from `JsonNodeDeserializer`)
---
if (!ctxt.isEnabled(JsonNodeFeature.READ_NULL_PROPERTIES)) {
continue;
}
---
it will now be much easier to add kind of configurability that has
been requested.
But beyond this, adding new Feature enums itself is relatively easy.
There are limitations,
of course -- there is no per-Module pluggability, for example, this is
for relatively general datatype classes (and mostly for
jackson-databind itself, but not exclusively esp for potential
`DateTimeFeature`) -- but this opens up many new possibilities.
On very short term at least we can tackle specifically JsonNode and
Enum read/write aspects, as per JSTEP-7.
Contributions welcome!
-+ Tatu +-