Extend, improve set of number value accessors for JsonNode
(JsonNode.intValue()
etc) [JSTEP-3]
#4958
Labels
Milestone
As explained on https://github.com/FasterXML/jackson-future-ideas/wiki/JSTEP-3 we want to improve and extend the set of Scalar value accessors like
asInt()
for Jackson 3.0.As of 2.x, there are a few accessors for types like, say,
int
:intValue()
: returnint
if (and only if!) we got numeric node (JsonToken.VALUE_NUMBER_INT
orJsonToken.VALUE_NUMBER_FLOAT) -- but won't throw exception, returns default value (
0`) otherwise. Also: can lose accuracy for FP numbers with fractionsintValue(int defaultValue)
--int
if coercible,defaultValue
if notasInt()
-- adds coercions from some non-numeric types tooBut none actually throws exception: partly due to historical reasons (was not done initially), and also since methods do not expose
JacksonException
(orIOException
). So this limitation is due to backwards compatibility (for 2.x)So there are a few things to improve for 3.0:
JsonNodeException
to useOptional
, as that is useful forstream()
operationsThis would lead to bigger set of methods, once again for
int
:intValue()
as before, return value ifJsonToken.VALUE_NUMBER_INT
, within Javaint
range AND has no fraction (if floating point value) -- but if not, throw exceptionintValue(int defaultValue)
asintValue()
except returnsdefaultValue
instead of exceptionintValueOpt()
similar tointValue()
but returnsOptionalInt
, either present (as perintValue()
) or absent (instead of exception)asInt()
(orasIntValue()
?) similar tointValue()
but allows coercion fromdouble
andString
, as well asnull
(and even Boolean?). But if not, throw exceptionasIntOpt()
likeasInt()
but returnsOptionalInt
, either present (as perasInt()
) or absent (instead of exception)We will add/change similar methods for:
longValue()
,longValue(long defaultValue)
,OptionalLong longValueOpt()
,asLong()
doubleValue()
,doubleValue(double defaultValue)
,OptionalDouble doubleValueOpt()
,asDouble()
BigDecimal
):decimalValue()
,decimalValue(BigDecimal defaultValue)
,Optional<BigDecimal> decimalValueOpt()
,asDecimal()
And we can consider additional accessors as well, but let's start with above.
NOTE:
bigIntegerValue()
-- samefloatValue()
shortValue()
-- samenumberValue()
-- same; needs to throw exception for non-numbersNOTE:
This issue does NOT yet add/change
JsonNode.asXxx()
but only (numeric)JsonNode.xxxValue()
methods (and variants) -- there's #5003 forasInt()
and such.The text was updated successfully, but these errors were encountered: