Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extend, improve set of non-number scalar value accessors for JsonNode (JsonNode.booleanValue() etc) [JSTEP-3] #4991

Closed
cowtowncoder opened this issue Feb 27, 2025 · 0 comments
Milestone

Comments

@cowtowncoder
Copy link
Member

cowtowncoder commented Feb 27, 2025

(note: related to #4958 but distinct)

As explained on https://github.com/FasterXML/jackson-future-ideas/wiki/JSTEP-3 we want to improve and extend the set of non-numeric Scalar value accessors like asBoolean() for Jackson 3.0.

As of 2.x, there are a few accessors for types like, say, boolean or String:

  • booleanValue(): return boolean if (and only if!) we got actual Boolean node -- but won't throw exception, returns default value (false) otherwise
  • asBoolean(): same as asBoolean(0)
  • asBoolean(boolean defaultValue): return boolean value from JSON Boolean OR if coercible (from String); otherwise return defaultValue`

But none actually throws exception: partly due to historical reasons (was not done initially), and also since methods do not expose JacksonException (or IOException). So this limitation is due to backwards compatibility (for 2.x)

So there are a few things to improve for 3.0:

  1. Should allow throwing exceptions, for case where no default is specified. We can now do this more easily as we throw unchecked exception -- meaning accessors are still safe with Java 8 streaming
    • Jackson 3.0 now has JsonNodeException to use
  2. Should allow use of Java 8 Optional, as that is useful for stream() operations

This would lead to bigger set of methods, once again for boolean:

  1. booleanValue() as before, return value if JSON Boolean -- but if not, throw exception
  2. booleanValue(boolean defaultValue) as booleanValue() except returns defaultValue instead of exception
  3. booleanValueOpt() similar to booleanValue() but returns Optional<Boolean>, either present (as per intValue()) or absent (instead of exception)
  4. asBoolean() similar to booleanValue() but allows coercion from Integral numbers (0 == false, anything else true) and String, as well as null But if not, throw exception
  5. asBooleanOpt() like asBoolean() but returns Optional<Boolean>, either present (as per asBoolean()) or absent (instead of exception)

We should also do the same for String (by default stringValue() only for JSON String; asString() for all scalar-types but not Objects/Arrays).

NOTE:

In addition to set for boolean there's:

  • stringValue(), asString()

And there are some partial accessors to handle too:

  • binaryValue()

NOTE 2:

This issue does NOT tackle asXxx() variants -- there's #5003 for that.

@cowtowncoder cowtowncoder changed the title Extend, improve set of non-number scalar value accessors for JsonNode (JsonNode.asBoolean() etc) for 3.0 [JSTEP-3] Extend, improve set of non-number scalar value accessors for JsonNode (JsonNode.booleanValue() etc) [JSTEP-3] Mar 4, 2025
@cowtowncoder cowtowncoder added this to the 3.0.0-rc1 milestone Mar 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant