-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Description
Is your feature request related to a problem? Please describe.
com.fasterxml.jackson.databind.ObjectReader#readValue(JsonNode)
currently only works with JsonNode
implementations from the jackson-databind
module. It does not work with custom JsonNode
implementations. We have a use case where we would like to use custom JsonNode
implementations.
Describe the solution you'd like
com.fasterxml.jackson.databind.ObjectReader#readValue(JsonNode)
should work with any JsonNode
implementation. The reason this currently does not work is because ObjectCursor
currently casts to ObjectNode
jackson-databind/src/main/java/com/fasterxml/jackson/databind/node/NodeCursor.java
Line 198 in 9e3a311
_contents = ((ObjectNode) n).fields(); |
There is no need for this as #fields()
is defined on JsonNode
. ArrayCursor
for example does not cast to ArrayNode
and just calls JsonNode#elements()
.
Usage example
JsonNode jsonNode = new CustomObjectNode();
this.objectMapper.readerFor(Custom.class).readValue(jsonNode);
Additional context
On our project we settled on Jackson and jackson-databind for our JSON parsing and object mapping needs. So far this has worked well for us. We also store JSON in the database as LOBs. Our database vendor has introduced a native JSON datatype. Part of this is a custom binary format to send JSON preparsed over the wire to the driver. The driver can use this format directly without the need to serialize to text first. The driver exposes this as javax.json.JsonObject
objects to our code.
We are experimenting with adapting javax.json.JsonObject
to com.fasterxml.jackson.databind.JsonNode
. This would give us the efficiency of being able to use the driver to parse the database internal format while still being able to use jackson-databind for the mapping.
Simply removing the cast seems to do the trick. An additional check could be introduced, on the other hand ArrayCursor
has no such check.