Skip to content

Jackson Release 3.2

Tatu Saloranta edited this page Jun 9, 2026 · 162 revisions

Jackson Version 3.2 was released June 8, 2026.

This wiki page gives a list of links to all changes (with brief descriptions) that are included.

Status

Version is under development (under branch 3.x).

It will NOT be designated as Long-Term-Support (LTS) since 3.1 is an LTS.

Patches

  • 3.2.1 (Not yet released)

Documentation

Articles, Blog posts

Changes, compatibility

Android

Up to SDK 34 for all components (Jackson 3.1 had SDK 26 for jackson-core, 34 for jackson-databind). Verified by "Animal Sniffer" plug-in.

JDK

Same as Jackson 3.1; Java 17.

Kotlin

Same as Jackson 3.1?

Compatibility: datatype modules

No changes.

Changes, behavior

Databind

Default changes

  • #1329 -- External type property (@JsonTypeInfo(include = As.EXTERNAL_PROPERTY)) deserialized even if visible = false -- fixed to now properly consider visibility
    • Fixes behavior but since wrong behavior has been in for a long time (since Jackson 2.7), a new MapperFeature.EXTERNAL_TYPE_ID_ALWAYS_VISIBLE (default: false) was added: it can be enabled to change behavior back to pre-3.2. (i.e. External Type Id property always visible)
  • #5734 -- "DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES treats absent field same as explicit null" -- changed handling so missing primitive values no longer fail unless DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES is enabled

Major focus area(s)

Most wanted Issues resolved

Issues with at least 5 thumbs-ups that were resolved in this version:

  • databind#1757: Regression in JsonInclude.Include.NON_DEFAULT set as global default serialization inclusion (add new MapperFeature.USE_REAL_INCLUDE_NON_DEFAULT)
  • dataformat-xml#90: Add support for adding attributes to output for root element
  • dataformat-xml#150: Allow specifying DOCTYPE declaration (<!DOCTYPE root ...>) to write
  • dataformat-xml#207: Allow custom prefixes for Namespaces
  • dataformat-xml#247: @JacksonXmlRootElement does not enforce the local name during deserialization (add XmlReadFeature.ENFORCE_ROOT_ELEMENT_NAME)
  • dataformat-xml#306: Can not use @JacksonXmlText for Creator property (creator parameter)
  • dataformat-xml#315: Allow specifying encodings other than UTF-8 in XML declaration written
  • dataformats-text#36: Allow emitting YAML comments (YAMLGenerator.writeComment())

Full Change list

Changes, core

No separate 3.x versions released, uses jackson-annotations 2.22.

  • #679: Number parsing should fail for trailing dot (period)
  • #707: Add JsonReadFeature.ALLOW_HEXADECIMAL_NUMBERS for JSON5-style hexadecimal integer literals
  • #1211: Add JsonParser.willInternPropertyNames() to check whether property name interning is enabled
  • #1544: Validate read() parameters in MergedStream and UTF32Reader
  • #1545: Increase Android baseline from 26 to 34 in Jackson 3.2
  • #1564: Add SimpleStreamReadContext.rollbackValueRead() method
  • #1575: Implement document length tracking for DataInput-backed JSON parsers via subclass
  • #1576: Use Java 17 intrinsics for long multiplication
  • #1593: Add JsonGenerator.writeComment(String), JsonGenerator.canWriteComments()
  • #1598: Possible TOCTOU timing bug in BufferRecycler
  • #639: @JacksonInject with @JsonIdentityInfo causes deserialization failure (unresolved forward reference)
  • #644: Allow skipping writing of type id if type to serialize is defaultImpl
  • #1075: @JsonUnwrapped fields with matching @JsonIgnored getter in outer class are ignored
  • #1281: @JsonIgnoreProperties should work for "any getter" (for serialization)
  • #1298: Writing ObjectId reference for @JsonUnwrapped property fails with obscure error message
  • #1329: External type property (@JsonTypeInfo(include = As.EXTERNAL_PROPERTY)) deserialized even if visible = false
  • #1410: Overlap between @JsonTypeInfo.As.PROPERTY indicated type id and field with same name results in UnrecognizedPropertyException
  • #1496: Support use of Object IDs with Builders
  • #1515: @JsonSerialize(Typing.DYNAMIC) in some cases does not override MapperFeature.USE_STATIC_TYPING
  • #1528: @JsonTypeInfo visible property set to null in defaultImpl class
  • #1546: Resolving forward references of collections might result in corrupt behaviour
  • #1622: Failure to deserialize child object when using @JsonIgnoreProperties to break cycle
  • #1706: @JsonCreator not working properly with @JsonIdentityInfo when deserializing a collection of interfaces (immutables.io compatibility)
  • #1755: Get NPE on deserializing values with recursive @JsonIgnoreProperties
  • #1757: Regression in JsonInclude.Include.NON_DEFAULT set as global default serialization inclusion (add new MapperFeature.USE_REAL_INCLUDE_NON_DEFAULT)
  • #1921:Reader for updating do not use @JsonCreator constructor
  • #2039: @JsonUnwrapped and JsonTypeInfo.As.EXTERNAL_PROPERTY in the same bean doesn't work
  • #2100: Using ObjectReader.withValueToUpdate() with JsonPOJOBuilder no longer working
  • #2572: Can't deserialize inner class if default setter is Nulls.AS_EMPTY
  • #2736: Unable to deserialize @JsonUnwrapped Optional<> field
  • #2747: @JsonTypeInfo(include = EXTERNAL_PROPERTY) exposes bogus array via JsonStreamContext during deserialization
  • #2780: Deserialization with Default Typing and @JsonIdentityInfo in untyped collections fails
  • #2883: Annotation @JsonUnwrapped can serialize duplicate properties
  • #2955: Handling UnresolvedForwardReference by pre-processing illegal values
  • #3030: Correctly deserialize forward @JsonIdentityInfo references when using @JsonCreator
  • #3064: @JsonPropertyOrder(alphabetic=true) is ignored in case indices are defined for @JsonProperty -- add MapperFeature.SORT_PROPERTIES_BY_INDEX
  • #3083: @JsonIncludeProperties could be used like @JsonPropertyOrder
  • #3166: Ability to sort Sets before serialization (add SerializationFeature.ORDER_SET_ELEMENTS)
  • #3169: @JsonIncludeProperties does not work together with @JsonIdentityInfo
  • #3178: @JsonUnwrapped deserialization results in empty nested object when using prefix
  • #3185: @JsonIdentityInfo with @JsonCreator incorrectly sets a field
  • #3194: Deserialization of 2-dimensional arrays of final types fails when using DefaultTyping.NON_FINAL
  • #3209: Polymorphism with aliases fails to utilize alias fields
  • #3216: Delegating @JsonCreator does not prevent unnecessary introspection of properties, leading to bogus failure
  • #3205: ConfigOverrides for merging are not applied for items inside containers
  • #3229: Existing instance of a local/anonymous Class cannot be updated
  • #3316: Deserialization of a date with @JsonFormat specified with locale that is not a language tag
  • #3355: Deserialization fails depending on the order of deserialized objects with "Cannot construct instance (although at least one Creator exists)"
  • #3547: When using type id with As.EXTERNAL_PROPERTY together with @JsonValue inside type the serialiser omits external type id field from result when @JsonValue value is null
  • #3573: Inconsistent handling of nil UUID in property inclusion
  • #3591: Ignored fields not consistently exposed via BeanDescription.getIgnoredPropertyNames()
  • #3604: Allow use of JsonNode field for @JsonAnyGetter
  • #4014: No way to combine @JsonTypeInfo(include = As.PROPERTY) and @JsonIdentityInfo(generator = PropertyGenerator.class)
  • #4758: ConfigOverride using Nulls.AS_EMPTY does not work with @JsonManagedReference
  • #4983: JsonTypeInfo.Id.MINIMAL_CLASS generates invalid type on sub-package
  • #5281: Reading into existing instance uses creator property setup instead of mutator (setter, field)
  • #5330: @JsonPropertyon enum values with @JsonFormat(shape = JsonFormat.Shape.NUMBER) is ignored
  • #5353: Preserve order of @JsonAnySetter creator property arguments
  • #5615: JsonMapper seems to be not thread-safe when using the polymorphic JsonTypeInfo.As.PROPERTY definition (and @JsonIgnoreProperties)
  • #5727: VisibilityChecker overrides equals() without overriding hashCode()
  • #5734: DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES treats absent field same as explicit null
  • #5745: Ability to change active JsonView on submodels (with `@JsonApplyView')
  • #5821: Fix dead code and side-effect bug in BeanPropertyWriter.toString()
  • #5851: Regression of JsonTypeInfo.Id.MINIMAL_CLASS in the 3.x branch
  • #5860: Add new extension point for ObjectMapper, ObjectWriter: handler GeneratorInitializer called immediately after JsonGenerator created, before used
  • #5861: Allow injecting MissingNode for "absent" JsonNode via Creator (with JsonNodeFeature.MAP_ABSENT_TO_MISSING)
  • #5872: ObjectId resolution with Builder fails for interface types (UnresolvedForwardReference)
  • #5897: Excessive TokenBuffer allocations when deserializing records
  • #5909: Forward Object Id references inside Collection properties leak Builder instance (follow-up to #1496)
  • #5937: Add SerializationContext.withActiveView()
  • #5946: Forward Object Id references inside typed Array (T[] where T is NOT java.lang.Object) not handled correctly
  • #5952: @JsonIgnore does not prevent passing of property to @JsonAnySetter
  • #5958: @JsonView ignored with @JsonTypeInfo(include = As.EXTERNAL_PROPERTY)
  • #5960: Deprecate un-maintained tools.jackson.databind.jsontype.impl.SubTypeValidator
  • #5975: Parameters with an ImplicitPropertyName that matches the name of a property marked as READ_ONLY are ignored during deserialization
  • #5977: Apply per-property DYNAMIC typing override to ObjectArraySerializer
  • #5980: Property-based Creator clobbers enclosing value's JsonParser.currentValue()
  • #6010: WRITE_ENUMS_TO_LOWERCASE must use Locale.ROOT for case folding
  • #6017: Make @JsonUnwrapped compatible with @JsonSerialize(converter = )

Changes, data formats

Avro

  • #611: Remove IOException from AvroMapper.schemaFrom() method signatures

CSV

  • #9: Incorrect detection of hasNextValue() for simple iteration with String[]
  • #210: Quote strings with leading/trailing spaces in csv (CsvWriteFeature.QUOTE_STRINGS_WITH_LEADING_TRAILING_WHITESPACE)
  • #264: CsvMapper applies alphabetic Property Order for Java Records
  • #327: Catch and report duplicate column names in header line (add CsvReadFeature.FAIL_ON_DUPLICATE_HEADER_COLUMNS)
  • #355: Allow mapping empty cells (columns) as "absent" properties (i.e. skip) by CsvReadFeature.EMPTY_UNQUOTED_STRING_AS_MISSING
  • #368: Allow skipping csv rows with only empty values (line of commas)
  • #631: Add CsvFactory.builder().maxQuoteCheckChars() for configuring heuristic quoting check
  • #634: Support for StreamReadConstraints.maxNameLength for CSV parsing
  • #643: CsvParser doesn't handle whitespace outside of quoted values correctly
  • #657: CSV header validation ignores ACCEPT_CASE_INSENSITIVE_PROPERTIES: add CsvReadFeature.CASE_INSENSITIVE_HEADERS

Properties

  • #638: Support for StreamReadConstraints.maxNameLength and maxStringLength for Properties parsing

Smile

  • #674: Smile parser does not update StreamReadContext index or entry count

TOML

  • #663: TOML parser: int64 max value parsed as truncated long
  • #664: TOML parser: space separator in offset/local datetime not accepted
  • #665: TOML parser: leading UTF-8 BOM rejected as 'Unknown token'
  • #666: TOML parser: invalid UTF-8 byte sequences not rejected
  • #667: TOML parser: out-of-range datetime/date/time field values not rejected
  • #668: TOML parser: surrogate-half unicode escapes accepted in strings
  • #669: TOML parser: invalid dotted-key extension of explicit tables / AOT not rejected
  • #685: Improve TOML 1.1.0 compatibility (parsing)
  • #8: Serialization of List incorrect if property declared as plain java.lang.Object
  • #27: @JacksonXmlElementWrapper conflicting getter/setter definitions for property
  • #90: Add support for adding attributes to output for root element
  • #149: @JacksonXmlElementWrapper as a @JsonCreator parameter not working
  • #150: Allow specifying DOCTYPE declaration (<!DOCTYPE root ...>) to write
  • #192: Two wrapped lists with items of same name conflict
  • #207: Allow custom prefixes for Namespaces
  • #247: @JacksonXmlRootElement does not enforce the local name during deserialization (add XmlReadFeature.ENFORCE_ROOT_ELEMENT_NAME)
  • #248: @JacksonXmlProperty with attributes raises an exception when used with @JsonIdentityInfo
  • #299: @JsonUnwrapped with a @JacksonXmlElementWrapper(useWrapping=false) on a collection fails reading from XML
  • #306: Can not use @JacksonXmlText for Creator property (creator parameter)
  • #315: Allow specifying encodings other than UTF-8 in XML declaration written
  • #334: @JacksonXmlElementWrapper(useWrapping=false) fails when using a DeserializerModifier that delegates
  • #344: Unable to (de)serialize null in polymorphic Collection -- may need to use xsi:nil handling?
  • #358: Allow skipping attributes from the http://www.w3.org/2001/XMLSchema-instance namespace (with new XmlReadFeature.SKIP_UNKNOWN_XSI_ATTRIBUTES)
  • #426: InvalidTypeIdException when parsing XML to POJO containing nested List<> , custom TypeIdResolver
  • #448: Allow use of @JsonRawValue without wrapping element
  • #449: Trouble dealing with JacksonXMLText if properties are present or if element is in a collection
  • #452: Allow adding <?xml-stylesheet ...> declarations (Processing Instructions)
  • #455: Can't deserialize list in JsonSubtype when type property is visible
  • #484: Add FromXmlParser.Feature.WRAP_ROOT_ELEMENT_NAME to allow lossless round-trip via Tree Model
  • #496: Root name missing when root element has no attributes (add FromXmlParser.getRootElementName())
  • #514: Deserialisation to polymorphic class using JsonTypeInfo.Id.DEDUCTION and @JacksonXmlElementWrapper annotation fails
  • #517: XML wrapper doesn't work with java records
  • #525: Order of XML Properties trigger different behaviors with polymorphic nested objects
  • #541: Allow specifying URI of the default namespace for root element
  • #556: XmlMapper does not support multi-dimensional arrays
  • #565: Blank text is ignored in @JacksonXmlText
  • #561: Deserializing empty timestamp fields to null value doesn't work (instead becomes "empty", Epoch time)
  • #567: First element in unwrapped XML array is ignored during deserialization to base class
  • #608: Jackson fails to instantiate class when only text node is present
  • #615: Deserialization of Xml with @JacksonXmlText using @JsonCreator (into java.util.Map) fails
  • #627: Disabling wrapper on list (defaultUseWrapper = false) does not serialize/deserialize null lists as expected
  • #629: @JsonAnySetter mangles nested xml Elements and Attributes during serialization
  • #665: @JacksonXmlProperty appears to behave differently than @JsonProperty when used on java records
  • #735: Java Record with @JacksonXmlText stopped working with 2.18
  • #762: Unwrapping lists does not work inside @JsonUnwrapped
  • #767: Unwrapped lists cannot be deserialized when using JsonTypeInfo.As.EXISTING_PROPERTY
  • #795: HttpHeader object (= ) is not wrapped by the XML <property> tag
  • #802: Serialization with Polymorphisme and EXTERNAL_PROPERTY = duplicate property
  • #845: Implement JsonGenerator methods writeComment() and canWriteComments()
  • #849: Allow writing Comments in Document Prolog (before root element)
  • #853: InvalidDefinitionException on classes using @JacksonXmlElementWrapper and @JacksonXmlProperty
  • #857: @JacksonXmlText with unwrapped Collection property fails to deserialize list (skips virtual wrapping)

YAML

  • #22: YAML anchors don't seem to work with @JsonCreator
  • #25: YAML anchor error when @JsonSubTypes used
  • #36: Allow emitting YAML comments (YAMLGenerator.writeComment())
  • #109: YAMLMapper doesn't close output file if an error occurs
  • #214: Expose custom tags via YAMLParser.getRawTag()
  • #276: Support opting out of octal number interpretation (like "0444"); add YAMLReadFeature.PARSE_OCTAL_NUMBERS
  • #292: YAML anchor UnresolvedForwardReference with builder
  • #623: Add support for YAML 1.2 non-finite (Infinite, -Infinite, NaN) numbers, Octal notation
  • #636: Support for StreamReadConstraints.maxNameLength and maxStringLength for YAML parsing

Changes, data types

Jakarta-mail

  • #85: Upgrade com.sun.mail:jakarta.mail dependency from 2.0.1 to 2.0.2

Joda

  • #183: Bump joda-time dependency to 2.14.1

Changes, other Modules

Afterburner

  • #314: ObjectMapper with jackson-module-afterburner: java.lang.IllegalStateException: Multiple definitions of method getBody found
  • #345: Improve Afterburner testing, access checks
  • #347: Add "afterburner-tests"; enhanced Afterburner-for-classpath tests
  • #348: Afterburner parent-classloader caching silently broken on Java 9+ without --add-opens java.base/java.lang=ALL-UNNAMED

Blackbird

  • #349: Added module "blackbird-tests" for classpath-mode Blackbird coverage

Clone this wiki locally