Jackson Release 3.1 (original) (raw)
Jackson Version 3.1 is a Major New version, released on February 23, 2026. One release candidate (3.1.0-rc1) was released prior to official 3.1.0.
This wiki page gives a list of links to all changes (with brief descriptions) that are 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..
Branch is designated a Long-Term-Support (LTS) version and is thereby expected to remain open for at least 2 years after 3.1.0 release.
Patches
- 3.1.1 (27-Mar-2026)
- 3.1.2 (11-Apr-2026)
- 3.1.3 (01-May-2026)
- 3.1.4 (29-May-2026)
- 3.1.5 (Not yet released)
Pre-releases
Following pre-release versions were released:
3.1.0-rc1(27-Jan-2026)
Documentation
Articles, Blog posts
New Modules
jackson-module-jsonSchemaupgraded to also have 3.1 variant- See: jsonSchema#166
Changes, packaging
- With databind#5361: CycloneDX SBOM publishing works again
Changes, compatibility
Android
Same as Jackson 3.0:
- SDK 26 for
jackson-core - SDK 34 for other components
JDK
Same as Jackson 3.0: JDK 17
Kotlin
Same as Jackson 3.0?
Changes, behavior
Missing/absent AtomicReference deserialization
With databind#5350 -- addition of DeserializationFeature.USE_NULL_FOR_MISSING_REFERENCE_VALUES -- the default deserialization behavior of AtomicReference<T> changes to same as that of Optional<T>:
- If value is missing (absent) from incoming JSON AND
AtomicReferenceis passed through Constructor, "empty" value (new AtomicReference<>(null)) will be deserialized instead ofnull(as previously). - Change necessary to add configurability, improves consistency.
Processing limits
With #1538 default StreamReadConstraints.maxStringLength increases from 20M to 100M.
Changes to JsonNode logic
databind#5558: Changes defaulting of JsonNode.asXxx(defaultValue)/JsonNode.asXxxOpt() methods for NullNode (JSON null values): * nulls will work more like "missing node" and return 'default value' when one given
JAX-RS / Jakarta-RS Providers
Matching of missing Media-Type
- JAX-RS-providers#162: Fix errant “accept anything” handling of providers
- Jakarta-RS-providers#64: Fix errant “accept anything” handling of providers
Change to by default NOT match empty/missing Media-Type header. Blind matching can be re-enabled with:
// JAX-RS
JacksonJsonProvider prov = new JacksonJsonProvider();
prov.enable(JaxRSFeature.MATCH_ALL_IF_NO_MEDIA_TYPE);
// Jakarta-RS
JacksonJsonProvider prov = new JacksonJsonProvider();
prov.enable(JakartaRSFeature.MATCH_ALL_IF_NO_MEDIA_TYPE);
Major focus area(s)
Finalize default configuration, behavior, for 3.x series
Although we tried to establish stable baseline for default settings, behavior, for 3.0.0 GA, some things were missed. Goal for 3.1 is to make last changes we need to minimize disruptions with later 3.x minor versions.
Bug fix, bug fixes, bug fixes
With 3.0.0 out of the way, issue backlog for components -- and especially jackson-databind -- had grown quite a bit. So major focus was on fixing things, at expense of adding new features.
Most wanted Issues resolved
Issues with at least 5 thumbs-ups that were resolved in this version
- databind#1196: Add support for collecting multiple deserialization failures during processing, not just the first one
- databind#1497: Allow skipping
@JsonUnwrappedvalues if no properties matched,DeserializationFeature.USE_NULL_FOR_EMPTY_UNWRAPPEDenabled - databind#1516: Problem with multi-argument Creator with
@JsonBackReferenceproperty - databind#1981: Add method
remove(JsonPointer)inContainerNode
Full Change list
Changes, core
Annotations
No separate 3.x versions released, uses jackson-annotations 2.21.
Streaming
- #784: Optional leading plus sign not included in textual value of any integral nor all floating-point numbers
- #1288: Add new method like
JsonParser.readString(Writer)(and implementation) for truly non-buffering reads - #1506: Non-blocking parser parses numbers eagerly; does not report error with missing space
- #1514: Additional configuration to closer match Jackson 2 behavior
- #1527:
TokenStreamFactory.createNonBlockingByteBufferParser()return type wrong - #1534: Change
TreeCodecto take type parameterT extends TreeNode - #1538: Increase default
StreamReadConstraints.maxStringLengthto 100M (from 20M) - #1541: Unexpected Illegal surrogate character when parsing field names
- #1548:
StreamReadConstraints.maxDocumentLengthnot checked when creating parser with fixed buffer - #1553: Max Depth validation not working for
DataInput-backedJsonParsers in 3.0 [CVE-2026-29062] - #1555: Enforce
StreamReadConstraints.maxNumberLengthfor non-blocking (async) parser
Databind
- #221: Support alternate radixes when writing numeric values as strings
- #429: Cannot use property annotations on
StackTraceElementto configure deserialization - #650:
@JsonUnwrappedprevents checks forDeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES - #1196: Add support for collecting multiple deserialization failures during processing, not just first one
- #1391: Default typing adds typing info to collections even with
@JsonTypeInfo(use = Id.NONE)override - #1419:
JsonFormat.Shape.POJOdoes not work forMap.Entryvia property annotation - #1497: Allow skipping
@JsonUnwrappedvalues if no properties matched,DeserializationFeature.USE_NULL_FOR_EMPTY_UNWRAPPEDenabled - #1516: Problem with multi-argument Creator with
@JsonBackReferenceproperty - #1649:
@JsonInclude(content=)not working forMap-valued properties via POJO class annotation - #1654:
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)override on property is ignored - #1811:
@JsonAnySetterand@JsonUnwrappeddeserialize property twice - #1981: Add method
remove(JsonPointer)inContainerNode - #2124: Allow coercion of '[ ]' into empty/null String with
ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT - #2343: Add
JsonNode.asArray()andJsonNode.asObject() - #2438: Prevent use of setter/field in case Creator property already exists, duplicate value seen
- #2617:
@JsonDeserialize.converterfrom an interface doesn't work - #2624: Allow overriding builder's "withPrefix" with new
@JsonDeserialize.builderPrefixproperty - #2686:
@JsonBackReferencedoes not work with a builder - #3079: Support
ObjectMapper.updateValue()for Record classes - #3084:
Nulls.AS_EMPTYdoesn't work for collections containing values without default constructor (like Records) - #3163: Huge performance problem deserializing
java.nio.file.Pathwith existing Windows Samba/CIFS mounts - #3188: Skip unknown
Enumkeys inMapdeserialization - #3284: Backward compatibility for timezone formats of UTC Date serialization
- #3304: Cannot deserialize back references for abstract types with
@JsonBackReferenceonly in sub-type - #3349:
DeserializationProblemHandler.handleUnexpectedToken()no longer invoked for array-like types - #3786: Deserialization of generic container (of Record type) using
EXTERNAL_PROPERTYfails for "natural" types (boolean/long/String/double) because type information is missing - #3884: Add
ObjectNode.put(JsonPointer, JsonNode)method - #3964: Deserialization issue: MismatchedInputException, Bean not yet resolved
- #4118: Deserialization of a certain kinds of parametrized properties fail to resolve
?into expected bounds, resulting inLinkedHashMap - #4157: Add
MapperFeature.INFER_RECORD_GETTERS_FROM_COMPONENTS_ONLYto ignore getter method auto-detection for Records - #4277: Deserialization
@JsonFormat(shape = JsonFormat.Shape.ARRAY)POJO withJsonTypeInfo.As.EXTERNAL_PROPERTYdoes not work - #4629:
@JsonIncludePropertiesand@JsonIgnorePropertiesignored when deserializing Records - #4690: InvalidDefinitionException "No fallback setter/field defined for creator property" when deserializing JSON with dup property to single-property Record
- #4708:
JsonTypeInfo.Id.DEDUCTIONshould block signatures for non-instantiable types (abstract classes, interfaces) - #4729: Object ID handling tries (unnecessarily) to set id value on a Record
- #5115:
@JsonUnwrappedRecord deserialization can't handle name collision - #5184:
@JsonIgnoreon record method applied to record matching field at deserialization - #5188: Prevent use of unsupported
@JsonManagedReference/@JsonBackReferencefor Record-valued properties - #5223: Java Records missing type information with
DefaultTyping.NON_FINAL(addDefaultTyping.NON_FINAL_AND_RECORDS) - #5285: Generics using wildcard not correctly resolved
- #5312:
JsonInclude.Include.NON_DEFAULTregression for Records with@JsonValue - #5350: Add
DeserializationFeature.USE_NULL_FOR_MISSING_REFERENCE_VALUESfor selectingnullvs "empty/absent" value when deserializing missingOptionalvalue - #5361: Fix Maven SBOM publishing (worked in 3.0.0-rc4 but not in rc5 or later)
- #5369: Support
@JsonInclude.contentforCollections (withSerializationFeature.APPLY_JSON_INCLUDE_FOR_CONTAINERS) - #5405:
@JsonFormat(shape = Shape.POJO)does not work forjava.util.Mapserialization via property annotation - #5413: Add/support forward reference resolution for array values
- #5442: Make
JsonMapper/ObjectMapperfully proxyable by CGLIB - #5456: Additional configuration (
JsonNodeFeature.STRIP_TRAILING_BIGDECIMAL_ZEROES: true) toMapperBuilder#configureForJackson2to closer match Jackson 2 behavior - #5475: Support
@JsonDeserializeAsannotation - #5476: Support
@JsonSerializeAsannotation - #5485: Unchecked conversion warning in
JsonMapperwrtTreeCodec.readTree()override - #5515: Support
@JsonInclude.contentfor Arrays - #5519: Add 2 new
JavaTimeFeatures: (TRUNCATE_TO_MSECS_ON_WRITE,TRUNCATE_TO_MSECS_ON_READ) for truncatingjava.timevalues before serialization, after deserialization - #5522:
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)doesn't work on custom Collection subclass - #5528:
TreeBuildingGenerator#writeNumber(String)writes Number as String - #5537: Add missing
@JsonIdentityInfohandling for implicitCollections withDeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY - #5541: Add missing
@JsonIdentityInfohandling for implicit arrays withDeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY - #5542:
ObjectReader.readValue()does not fail whenDeserializationFeature.FAIL_ON_UNRESOLVED_OBJECT_IDSenabled - #5558: Change defaulting of
JsonNode.asXxx(defaultValue)/JsonNode.asXxxOpt()forNullNode - #5570: Add
MapperFeature.WRAPPERS_DEFAULT_TO_NULLto allow configuringJsonInclude.Include.NON_DEFAULTdefault for primitive wrapper types to benull, not wrapped default of primitive - #5575: Allow configuring a default serialization and deserialization view (3.x)
- #5579: Add
JsonNode.map()method - #5581: Add functional conversion methods
JsonNode.nullAs(),JsonNode.missingAs() - #5583: Improve
asXxx()method impls ofMissingNode,POJONode(null), to work likeNullNode - #5586: Change
IndexOutOfBoundsExceptionthatArrayNode.set()/replace()throw toJsonNodeException - #5595: Add
FunctionalScalarDeserializerfor functional-style deserialization - #5599: Reduce mutability of
JsonFormatVisitortypes in 3.1 - #5616:
ObjectWriterserializesOptionals with subtypes incompletely - #5621: Fix typo: MissingInjectableValueExcepion → MissingInjectableValueException
- #5630: Add
DelegatingSerializer - #5642: Wrap
DateTimeExceptionandArithmeticExceptionin newDateTimeParseExceptionduring java.time deserialization - #5646:
ObjectArrayDeserializermay throwArrayStoreExceptionfor some special cases - #5649: Wrap
LocalDate.ofEpochDay()andInstant.ofEpochSecond()to throwDateTimeParseExceptionon invalid values - #5674: Fix NPE when deserializing
Throwablewithnull"stackTrace" - #5683: When deserializing using
ObjectMapper::treeToValue, NPE occurs whenJsonParser::readValueAsis called - #5685: Fix issue where
_findSerializer()was called with incorrect argument inStdDelegatingSerializer::isEmpty() - #5686: Fix NPE where code can look for an objectId when no
_objectIdReaderis set - #5691: Validate
ByteBufferBackedInputStream.read()parameters perInputStreamcontract - #5706:
TokenBufferserialization fails when buffer contains integer encoded as String - date-time#359:
InstantDeserializerdeserializes the nanosecond portion of fractional negative timestamps incorrectly- NOTE: ported over to embedded Java 8 Date/Time functionality
Changes, dataformats
Avro
- #514: Update to Avro 1.12.1 (Jackson 3.x only)
- #619: Add
isEnabled()methods for format-specific features to mappers - #628: Uncommon parent pom dependency configuration in Jackson 2.20/3.0
CBOR
- #619: Add
isEnabled()methods for format-specific features to mappers - #628: Uncommon parent pom dependency configuration in Jackson 2.20/3.0
- #649:
StreamReadConstraints.maxDocumentLengthnot checked when creating parser with fixed buffer
CSV
- #479:
STRICT_CHECK_FOR_QUOTINGdoes not quote value that contains newline character - #579: Incorrect detection of missed columns in header line if columns reordering is enabled
- #581: Add
isEnabled()methods for format-specific features to mappers - #601: Reader should allow separating plain
nullValueand quoted value"nullValue" - #604: Remove
CsvParser.enable()/.disable()/.configure()(reduce mutability) - #608: Fix issue with UTF-8 surrogate pair decoding
- #613: Support
StreamReadConstraints.maxDocumentLength()validation for CSV module
Ion
- #436:
IonFactory.createParser(IonReader)does not initialize state - #619: Add
isEnabled()methods for format-specific features to mappers - #623: Upgrade
ion-javadep to 1.11.11 (from 1.11.10) - #628: Uncommon parent pom dependency configuration in Jackson 2.20/3.0
- #629: Unnecessary
IOExceptioninIonObjectMappermethod signatures
Protobuf
- #73: Cannot resolve inner types in protoc definitions
- #598: Protobuf parser state handling wrong for implicit close (END_OBJECT)
- #628: Uncommon parent pom dependency configuration in Jackson 2.20/3.0
Smile
- #619: Add
isEnabled()methods for format-specific features to mappers - #628: Uncommon parent pom dependency configuration in Jackson 2.20/3.0
- #649:
StreamReadConstraints.maxDocumentLengthnot checked when creating parser with fixed buffer
TOML
- #581: Add
isEnabled()methods for format-specific features to mappers - #608: Fix issue with UTF-8 surrogate pair decoding
XML
- #780: Add
isEnabled()methods for format-specific features to mappers
YAML
- #568: YAML - ScannerException on block scalar "\n"
- #581: Add
isEnabled()methods for format-specific features to mappers - #590: Upgrade to the latest version of SnakeYAML Engine (3.0.1)
- #596: Port
YAMLAnchorReplayingFactoryfrom 2.x and improve it to handle nested anchors - #608: Fix issue with UTF-8 surrogate pair decoding
- #609: Catch and rethrow yaml engine internal exception on generation
Changes, data types
Guava
- #211:
GuavaMultimapDeserializerdoes not respectJsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY - #215: Add special handling for 0 and 1 size Guava immutable collections
- #218: Fix input mismatch error message in
RangeDeserializer - #221: Add try catch for guava deserializers
- #223: Catch and re-throw
IllegalArgumentExceptionforRangeconstruction
Eclipse-collections
- #219: Improve error handling for number parsing
Hibernate
- #199: Switch to reload4j in tests
Joda Money
- #581: Add field-level amount representation for Joda-Money (
@JodaMoneyannotation)
Changes, Other modules
Afterburner
- #317: Update byte-buddy to latest (1.17.8) from 1.15.1
Blackbird
- #334:
BlackbirdModuledoes not implementjava.io.Serializable
JSON Schema
- #166: Support Jackson 3
Mr Bean
- #317: Update byte-buddy to latest (1.17.8) from 1.15.1
- #320: Remove
byte-buddyshading from 3.1 MrBean
Changes, Providers
JAX-RS Providers
- #162: Fix errant “accept anything” handling of providers
- #226: Add constructor accepting
JsonMapperConfiguratortoJackson(Jaxb)JsonProvider
Jakarta-RS Providers
- #63: Add constructors accepting
[Format]MapperConfiguratorto providers - #64: Fix errant “accept anything” handling of providers
Changes, JVM Languages
Kotlin
- #1077: Increase deprecation level of NewStrictNullChecks due to version upgrade
Scala
- #787 support JsonInclude filter for Scala collections
Changes, other
N/A