-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Jackson Release 3.1
Jackson Version 3.1 is being readied for release, as of February 2026.
One release candidate (3.1.0-rc1) has been released so far.
This wiki page gives a list of links to all changes (with brief descriptions) that will eventually be included, as well as about original plans for bigger changes (and in some cases changes to plans, postponing).
Version is under development (under branch 3.x).
It will likely become the first Long-Term Support (LTS) version for Jackson 3.
No release yet.
Following pre-release versions were released:
-
3.1.0-rc1(27-Jan-2026)
-
jackson-module-jsonSchemaupgraded to also have 3.1 variant- See: jsonSchema#166
- With databind#5361: CycloneDX SBOM publishing works again
Same as Jackson 3.0, SDK 34
Same as Jackson 3.0: JDK 17
Same as Jackson 3.0?
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.
With #1538 default StreamReadConstraints.maxStringLength increases from 20M to 100M.
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-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);
- 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
No separate 3.x versions released, uses jackson-annotations 2.21.
- #784: Optional leading plus sign not included in textual value of any integral nor all floating-point numbers
- #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
- #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 -
#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) -
#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 blocks 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 -
date-time#359:
InstantDeserializerdeserializes the nanosecond portion of fractional negative timestamps incorrectly- NOTE: ported over to embedded Java 8 Date/Time functionality
- #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
-
#619: Add
isEnabled()methods for format-specific features to mappers - #628: Uncommon parent pom dependency configuration in Jackson 2.20/3.0
-
#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
-
#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
- #598: Protobuf parser state handling wrong for implicit close (END_OBJECT)
- #628: Uncommon parent pom dependency configuration in Jackson 2.20/3.0
-
#619: Add
isEnabled()methods for format-specific features to mappers - #628: Uncommon parent pom dependency configuration in Jackson 2.20/3.0
-
#581: Add
isEnabled()methods for format-specific features to mappers - #608: Fix issue with UTF-8 surrogate pair decoding
-
#780: Add
isEnabled()methods for format-specific features to mappers
- #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
-
#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
- #219: Improve error handling for number parsing
-
-
#581: Add field-level amount representation for Joda-Money (
@JodaMoneyannotation)
-
#581: Add field-level amount representation for Joda-Money (
- #317: Update byte-buddy to latest (1.17.8) from 1.15.1
-
#334:
BlackbirdModuledoes not implementjava.io.Serializable
- #166: Support Jackson 3
- #317: Update byte-buddy to latest (1.17.8) from 1.15.1
-
#320: Remove
byte-buddyshading from 3.1 MrBean
- #162: Fix errant “accept anything” handling of providers
-
#226: Add constructor accepting
JsonMapperConfiguratortoJackson(Jaxb)JsonProvider
-
#63: Add constructors accepting
[Format]MapperConfiguratorto providers - #64: Fix errant “accept anything” handling of providers
N/A
- #787 support JsonInclude filter for Scala collections
N/A