Skip to content

Jackson Release 3.2

Tatu Saloranta edited this page May 28, 2026 · 162 revisions

Jackson Version 3.2 is under development as of February, 2026.

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

Status

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

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

Patches

No release yet.

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
  • #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
  • #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')
  • #5814: Enum deserialization does not respect JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_VALUES override
  • #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()
  • #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
  • #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

Afterburner

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

Clone this wiki locally