That sounds like a flaw. Could you please file an issue against
`jackson-dataformats-binary` to get this fixed/improved?

-+ Tatu +-

On Wed, Aug 24, 2016 at 8:56 AM, Elliot <[email protected]> wrote:

> Hello,
>
> I'm new to Jackson and using it to parse some JSON using Jackson annotated
> Java classes. The resultant tree is passed into another API that performs
> conversion to Avro objects subject to an Avro schema. In the POJO class I
> have a float field that I'm trying to map to and Avro Schema.Type.FLOAT.
> However. I'm finding that the Avro conversion code is tripping up as it is
> expecting the relevant node to return true from isFloat(). It turns out
> that the node representing the field is of type DoubleNode, not  FloatNode,
> as I would expect. Consequently the call to node.isFloat() returns false.
> Note that in this particular instance, the value of this field is well
> within the range of a Java float. I believe I have traced this behaviour
> back to com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer._
> fromFloat(...):
>
>     protected final JsonNode _fromFloat(JsonParser p,
> DeserializationContext ctxt,
>             final JsonNodeFactory nodeFactory) throws IOException
>     {
>         JsonParser.NumberType nt = p.getNumberType();
>         if (nt == JsonParser.NumberType.BIG_DECIMAL
>             || 
> ctxt.isEnabled(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS))
> {
>             return nodeFactory.numberNode(p.getDecimalValue());
>         }
>         return nodeFactory.numberNode(p.getDoubleValue());
>     }
>
> The last call to the nodeFactory returns a DoubleNode not a FloatNode. I
> wonder if this should instead be implemented like so:
>
>     protected final JsonNode _fromFloat(JsonParser p,
> DeserializationContext ctxt,
>             final JsonNodeFactory nodeFactory) throws IOException
>     {
>         JsonParser.NumberType nt = p.getNumberType();
>         if (nt == JsonParser.NumberType.BIG_DECIMAL
>             || 
> ctxt.isEnabled(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS))
> {
>             return nodeFactory.numberNode(p.getDecimalValue());
>         }
>         if (nt == JsonParser.NumberType.DOUBLE) {
>             return nodeFactory.numberNode(p.getDoubleValue());
>         }
>         return nodeFactory.numberNode(p.getFloatValue());
>     }
>
> Currently I am using this less than ideal work around in my Avro
> conversion code:
>
>     if (node.isDouble() && node.doubleValue() >= -Float.MAX_VALUE &&
> node.doubleValue() <= Float.MAX_VALUE || node.isFloat()) {
>         return datum.floatValue();
>
> Can anyone offer some insight on on the current implementation? Is there
> something I've overlooked or misunderstood regarding JSON/Jackson float
> handling or interpretation?
>
> Thanks,
>
> Elliot.
>
> --
> You received this message because you are subscribed to the Google Groups
> "jackson-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to