Skip to content

Jackson Release 2.19

Tatu Saloranta edited this page Apr 28, 2025 · 84 revisions

Jackson Version 2.19 was released on April 24, 2025. One release candidate (2.19.0-rc2) was released prior to final 2.19.0.

This wiki page gives a list of links to all changes (with brief descriptions) that were included, as well as about original plans for bigger changes (and in some cases changes to plans, postponing).

Status

Branch is open for patch releases.

Patches

Documentation

Articles, Blog posts

New Modules

Javax.money datatype support

Two new datatype modules added in jackson-datatypes-misc:

Changes, compatibility

Compatibility: platform requirements

Android

Same as Jackson 2.18, SDK 26

JDK

Same as Jackson 2.18 -- mostly Java 8

Kotlin

Same as Jackson 2.18?

Changes, behavior

JsonPointer

  • Handling of "orphan" tildes (~ not part of ~0 or ~1 escape sequence) changed:
    • #1361: JsonPointer parsing of '~' not followed by "0" or "1" unexpected
    • NOTE: use of such "orphan" tildes is not (well) covered by JSON Pointer specs so expected handling is not defined.
    • Old behavior used ~ as "general escape", i.e. skipped ~ and included following character
    • New behavior feels more expected: unpaired ~ will simply be included as-is

Major focus area(s)

Most wanted Features to implement

Most wanted Features implemented

  • #1467: Support @JsonUnwrapped with @JsonCreator

Most wanted Features considered but not implemented


Full Change list

Changes, core

  • #280: Minor change to module-info.java: use "open module"
  • #281: [gradle-module-metadata-maven-plugin] update to version 1.0
  • #284: Add OptBoolean valued @JsonProperty.isRequired to (eventually) replace @JsonProperty.required
  • #633: Allow skipping RS CTRL-CHAR to support JSON Text Sequences
  • #1144: FilteringParserDelegate can go into an infinite loop if underlying parser is non-blocking
  • #1328: Optimize handling of JsonPointer.head()
  • #1356: Make JsonGenerator::writeTypePrefix method to not write a WRAPPER_ARRAY when typeIdDef.id == null
  • #1361: JsonPointer parsing of '~' not followed by "0" or "1" unexpected
  • #1394: Wrong/misleading error for "extra" close token (] or }) when at root level
  • #1407: [gradle-module-metadata-maven-plugin] update to version 1.0
  • #1412: More cases of Non-blocking parser reporting incorrect locations when fed with non-zero offset
  • #1421: Make JsonReadContext non-final
  • #1467: Support @JsonUnwrapped with @JsonCreator
  • #2145: Add JsonNode.optional(String name) and optional(int index) methods
  • #2461: Nested @JsonUnwrapped property names not correctly handled
  • #2951: Allow inverting @JsonProperty(access=) with MapperFeature.INVERSE_READ_WRITE_ACCESS to work differently on server and client side
  • #3343: Allow BeanPropertyWriter Sub-classes to Override get() (remove final)
  • #4388: Allow using @JsonPropertyOrder with "any" (@JsonAnyGetter) properties
  • #4533: Add MapperFeature.REQUIRE_HANDLERS_FOR_JAVA8_TIMES to disable the "Java 8 date/time XYZ not supported by default" error
  • #4650: PrimitiveArrayDeserializers should deal with single String value if DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY enabled
  • #4674: Allow setting global enum naming strategy similar to property naming strategy
  • #4676: Support other enum naming strategies than camelCase
  • #4680: Custom key deserialiser registered for Object.class in nested Map object is ignored when Map key type not defined
  • #4771: QName (de)serialization ignores prefix
  • #4772: Serialization and deserialization issue of sub-types used with JsonTypeInfo.Id.DEDUCTION where sub-types are Object and Array
  • #4773: SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS should not apply to Maps with uncomparable keys
  • #4801: Add JsonNodeFeature.USE_BIG_DECIMAL_FOR_FLOATS to allow overriding DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS
  • #4849: Not able to deserialize Enum with default typing after upgrading 2.15.4 -> 2.17.1
  • #4863: Add basic Stream support in JsonNode: valueStream(), entryStream(), forEachEntry()
  • #4867: Add Optional<JsonNode> JsonNode.asOptional() convenience method
  • #4896: Coercion shouldn't be necessary for Enums specifying an empty string
  • #4915: Cannot access attributes from Converter
  • #4934: DeserializationContext.readTreeAsValue() handles null nodes differently from ObjectMapper.treeToValue()
  • #4938: Allow @JsonCreator annotated Creator to return null
  • #4953: Allow clearing all caches to avoid classloader leaks
  • #4955: Add more remove methods for ArrayNode, ObjectNode [STEP-3]
  • #4959: Add explicit deserializer for ThreadGroup
  • #4961: Serialization for JsonFormat.Shape.ARRAY does not work when there is @JsonAnyGetter
  • #4963: Serializing Map.Entry as Bean with @JsonFormat.shape = Shape.OBJECT fails on JDK 17+
  • #4979: Allow default enums with @JsonCreator
  • #4997: ObjectNode put methods should do null check for key
  • #5006: Add MapperFeature.REQUIRE_HANDLERS_FOR_JAVA8_OPTIONALS to prevent failure of java.util.Optional (de)serialization without Java 8 module
  • #5014: Add java.lang.Runnable as unsafe base type in DefaultBaseTypeLimitingValidator
  • #5020: Support new @JsonProperty.isRequired for overridable definition of "required-ness"
  • #5027: Add DeserializationFeature.FAIL_ON_SUBTYPE_CLASS_NOT_REGISTERED
  • #5052: Minor bug in FirstCharBasedValidator.forFirstNameRule(): returns null in non-default case
  • #5063: SimpleModule not registered due to getTypeId() returning an empty string
  • #5069: Add copy-constructor for MappingIterator

Changes, data formats

Avro

  • #308: Incorrect serialization for LogicalType.Decimal (Java BigDecimal)
  • #388: @JsonEnumDefaultValue not supported when using AvroMapper to generate schema from Java class
  • #422: Avro generation failed with enums containing values with special characters
  • #535: AvroSchemaGenerator: logicalType(s) never set for non-date classes
  • #536: Add Logical Type support for java.util.UUID

CBOR

  • #568: Improve ASCII decoding performance for CBORParser

CSV

  • #31: Header names seem to be trimmed (add CsvParser.Feature.TRIM_HEADER_SPACES))
  • #554: Enforce, document thread-safety of CsvSchema

Ion

  • #571: Unable to deserialize a pojo with IonStruct

Smile

  • #300: Floats are encoded with sign extension while doubles without
  • #508: XmlMapper is unable to deserialise into an empty record
  • #714: Root-level null handling (via xsi:nil) leaves trailing token in JsonParser-exposed token stream
  • #745: Add feature to include standalone='yes' in xml declaration

YAML

  • #502: Add an optional extended parser subclass (YAMLAnchorReplayingFactory) able to inline anchors
  • #537: Snakeyaml 2.4

Changes, datatypes

Guava

  • #1: Add deserialization support for Table<R, C, V>
  • #336: Optimize InstantDeserializer addInColonToOffsetIfMissing()
  • #337: Negative Duration does not round-trip properly with WRITE_DURATIONS_AS_TIMESTAMPS enabled
  • #342: Lenient deserialization of LocalDate, LocalDateTime is not time-zone aware
  • #364: Deserialization of Month in ONE_BASED_MONTHS mode fails for value "12"

Changes, Other modules

Blackbird

  • #285: JacksonBlackbirdAccess Class access exception with Groovy Script serialization using BlackbirdModule
Paranamer
  • #290: Update Paranamer dep from 2.8 to 2.8.3

Changes, JVM Languages

  • #835: Remove old SingletonSupport class and unified with KotlinFeature.SingletonSupport.
  • #839: Remove useKotlinPropertyNameForGetter and unify with kotlinPropertyNameAsImplicitName.
  • #858: Minor performance improvement of findDefaultCreator in edge cases.
  • #869: By using Enum.entries in the acquisition of KotlinFeature.defaults, the initialization load was reduced, albeit slightly.
  • #878: Fixed a problem where settings like @JsonSetter(nulls = AS_EMPTY) were not being applied when the input was undefined.
  • #883: The deprecation level has been raised to error for the MissingKotlinParameterException secondary constructor. This is a problematic process that has been marked as deprecated for a very long time and will be removed in 2.20 or later
  • #884: The base class for MissingKotlinParameterException has been changed to InvalidNullException.
  • #885: A new StrictNullChecks option(KotlinFeature.NewStrictNullChecks) has been added which greatly improves thr oughput.
  • #889: Kotlin has been upgraded to 1.9.25
  • #910: A default KeyDeserializer for value class has been added. This eliminates the need to have a custom KeyDeserializer for each value class when using it as a key in a M ap, if only simple boxing is needed.
  • #929: Fixed a problem with the NullToEmptyCollection and NullToEmptyMap options being applied to non-parameters in the hasRequiredMarker process.
  • #937: For readValue and other shorthands for ObjectMapper deserialization methods, type consistency checks have been added. A RuntimeJsonMappingException will be thrown in case of inconsistency.
  • #944: Common util is now used for member accessibility overrides.
  • #954: Replaced OptBoolean of internal caching with a common implementation.
  • #959: Extension functions has been added to simplify configOverride calls to ObjectMapper and Module.SetupContext.

Changes, Providers

  • #200: Narrow types to format specific (e.g. CBORMapper) when resolving via JAX-RS Providers
  • #36: Narrow types to format specific (e.g. CBORMapper) when resolving via JAX-RS Providers

Changes, other

  • #171: Add a JSON.Feature.WRITE_RECORD_FIELDS_IN_DECLARATION_ORDER for retaining Serialization order of Java Records (instead of alphabetic)
Clone this wiki locally