Skip to content

Jackson Release 3.1

Tatu Saloranta edited this page Feb 18, 2026 · 126 revisions

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).

Status

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

It will likely become the first Long-Term Support (LTS) version for Jackson 3.

Patches

No release yet.

Pre-releases

Following pre-release versions were released:

  • 3.1.0-rc1 (27-Jan-2026)

Documentation

Articles, Blog posts

New Modules

  • jackson-module-jsonSchema upgraded to also have 3.1 variant

Changes, packaging

Changes, compatibility

Android

Same as Jackson 3.0, SDK 34

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 AtomicReference is passed through Constructor, "empty" value (new AtomicReference<>(null)) will be deserialized instead of null (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

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)

Most wanted Features implemented

  • databind#1196: Add support for collecting multiple deserialization failures during processing, not just the first one
  • databind#1497: Allow skipping @JsonUnwrapped values if no properties matched, DeserializationFeature.USE_NULL_FOR_EMPTY_UNWRAPPED enabled
  • databind#1516: Problem with multi-argument Creator with @JsonBackReference property
  • databind#1981: Add method remove(JsonPointer) in ContainerNode

Full Change list

Changes, core

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 TreeCodec to take type parameter T extends TreeNode
  • #1538: Increase default StreamReadConstraints.maxStringLength to 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 StackTraceElement to configure deserialization
  • #650: @JsonUnwrapped prevents checks for DeserializationFeature.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.POJO does not work for Map.Entry via property annotation
  • #1497: Allow skipping @JsonUnwrapped values if no properties matched, DeserializationFeature.USE_NULL_FOR_EMPTY_UNWRAPPED enabled
  • #1516: Problem with multi-argument Creator with @JsonBackReference property
  • #1649: @JsonInclude(content=) not working for Map-valued properties via POJO class annotation
  • #1654: @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) override on property is ignored
  • #1981: Add method remove(JsonPointer) in ContainerNode
  • #2124: Allow coercion of '[ ]' into empty/null String with ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT
  • #2343: Add JsonNode.asArray() and JsonNode.asObject()
  • #2438: Prevent use of setter/field in case Creator property already exists, duplicate value seen
  • #2617: @JsonDeserialize.converter from an interface doesn't work
  • #2624: Allow overriding builder's "withPrefix" with new @JsonDeserialize.builderPrefix property
  • #2686: @JsonBackReference does not work with a builder
  • #3079: Support ObjectMapper.updateValue() for Record classes
  • #3084: Nulls.AS_EMPTY doesn't work for collections containing values without default constructor (like Records)
  • #3188: Skip unknown Enum keys in Map deserialization
  • #3284: Backward compatibility for timezone formats of UTC Date serialization
  • #3304: Cannot deserialize back references for abstract types with @JsonBackReference only in sub-type
  • #3349: DeserializationProblemHandler.handleUnexpectedToken() no longer invoked for array-like types
  • #3786: Deserialization of generic container (of Record type) using EXTERNAL_PROPERTY fails 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 in LinkedHashMap
  • #4157: Add MapperFeature.INFER_RECORD_GETTERS_FROM_COMPONENTS_ONLY to ignore getter method auto-detection for Records
  • #4277: Deserialization @JsonFormat(shape = JsonFormat.Shape.ARRAY) POJO with JsonTypeInfo.As.EXTERNAL_PROPERTY does not work
  • #4629: @JsonIncludeProperties and @JsonIgnoreProperties ignored 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.DEDUCTION should blocks signatures for non-instantiable types (abstract classes, interfaces)
  • #4729: Object ID handling tries (unnecessarily) to set id value on a Record
  • #5115: @JsonUnwrapped Record deserialization can't handle name collision
  • #5184: @JsonIgnore on record method applied to record matching field at deserialization
  • #5188: Prevent use of unsupported @JsonManagedReference/@JsonBackReference for Record-valued properties
  • #5223: Java Records missing type information with DefaultTyping.NON_FINAL (add DefaultTyping.NON_FINAL_AND_RECORDS)
  • #5285: Generics using wildcard not correctly resolved
  • #5312: JsonInclude.Include.NON_DEFAULT regression for Records with @JsonValue
  • #5350: Add DeserializationFeature.USE_NULL_FOR_MISSING_REFERENCE_VALUES for selecting null vs "empty/absent" value when deserializing missing Optional value
  • #5361: Fix Maven SBOM publishing (worked in 3.0.0-rc4 but not in rc5 or later)
  • #5369: Support @JsonInclude.content for Collections (with SerializationFeature.APPLY_JSON_INCLUDE_FOR_CONTAINERS)
  • #5405: @JsonFormat(shape = Shape.POJO) does not work for java.util.Map serialization via property annotation
  • #5413: Add/support forward reference resolution for array values
  • #5442: Make JsonMapper/ObjectMapper fully proxyable by CGLIB
  • #5456: Additional configuration (JsonNodeFeature.STRIP_TRAILING_BIGDECIMAL_ZEROES: true) to MapperBuilder#configureForJackson2 to closer match Jackson 2 behavior
  • #5475: Support @JsonDeserializeAs annotation
  • #5476: Support @JsonSerializeAs annotation
  • #5485: Unchecked conversion warning in JsonMapper wrt TreeCodec.readTree() override
  • #5515: Support @JsonInclude.content for Arrays
  • #5519: Add 2 new JavaTimeFeatures: (TRUNCATE_TO_MSECS_ON_WRITE, TRUNCATE_TO_MSECS_ON_READ) for truncating java.time values 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 @JsonIdentityInfo handling for implicit Collections with DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
  • #5541: Add missing @JsonIdentityInfo handling for implicit arrays with DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
  • #5542: ObjectReader.readValue() does not fail when DeserializationFeature.FAIL_ON_UNRESOLVED_OBJECT_IDS enabled
  • #5558: Change defaulting of JsonNode.asXxx(defaultValue)/JsonNode.asXxxOpt() for NullNode
  • #5570: Add MapperFeature.WRAPPERS_DEFAULT_TO_NULL to allow configuring JsonInclude.Include.NON_DEFAULT default for primitive wrapper types to be null, 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 of MissingNode, POJONode(null), to work like NullNode
  • #5586: Change IndexOutOfBoundsException that ArrayNode.set()/replace() throw to JsonNodeException
  • #5595: Add FunctionalScalarDeserializer for functional-style deserialization
  • #5599: Reduce mutability of JsonFormatVisitor types in 3.1
  • #5616: ObjectWriter serializes Optionals with subtypes incompletely
  • #5621: Fix typo: MissingInjectableValueExcepion → MissingInjectableValueException
  • #5630: Add DelegatingSerializer
  • #5642: Wrap DateTimeException and ArithmeticException in new DateTimeParseException during java.time deserialization
  • #5646: ObjectArrayDeserializer may throw ArrayStoreException for some special cases
  • #5649: Wrap LocalDate.ofEpochDay() and Instant.ofEpochSecond() to throw DateTimeParseException on invalid values
  • #5674: Fix NPE when deserializing Throwable with null "stackTrace"
  • #5683: When deserializing using ObjectMapper::treeToValue, NPE occurs when JsonParser::readValueAs is called
  • #5685: Fix issue where _findSerializer() was called with incorrect argument in StdDelegatingSerializer::isEmpty()
  • #5686: Fix NPE where code can look for an objectId when no _objectIdReader is set
  • #5691: Validate ByteBufferBackedInputStream.read() parameters per InputStream contract
  • date-time#359: InstantDeserializer deserializes 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

CSV

  • #479: STRICT_CHECK_FOR_QUOTING does 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 nullValue and quoted value "nullValue"
  • #604: Remove CsvParser.enable()/.disable()/.configure() (reduce mutability)
  • #608: Fix issue with UTF-8 surrogate pair decoding

Ion

  • #619: Add isEnabled() methods for format-specific features to mappers
  • #623: Upgrade ion-java dep to 1.11.11 (from 1.11.10)
  • #628: Uncommon parent pom dependency configuration in Jackson 2.20/3.0
  • #629: Unnecessary IOException in IonObjectMapper method signatures

Protobuf

  • #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

TOML

  • #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

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 YAMLAnchorReplayingFactory from 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: GuavaMultimapDeserializer does not respect JsonFormat.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 IllegalArgumentException for Range construction

Eclipse-collections

  • #219: Improve error handling for number parsing

Joda Money

    • #581: Add field-level amount representation for Joda-Money (@JodaMoney annotation)

Changes, Other modules

Afterburner

  • #317: Update byte-buddy to latest (1.17.8) from 1.15.1

Blackbird

  • #334: BlackbirdModule does not implement java.io.Serializable
  • #166: Support Jackson 3

Mr Bean

  • #317: Update byte-buddy to latest (1.17.8) from 1.15.1
  • #320: Remove byte-buddy shading from 3.1 MrBean

Changes, Providers

  • #162: Fix errant “accept anything” handling of providers
  • #226: Add constructor accepting JsonMapperConfigurator to Jackson(Jaxb)JsonProvider
  • #63: Add constructors accepting [Format]MapperConfigurator to providers
  • #64: Fix errant “accept anything” handling of providers

Changes, JVM Languages

Kotlin

N/A

Scala

  • #787 support JsonInclude filter for Scala collections

Changes, other

N/A

Clone this wiki locally