Skip to content

Jackson Release 3.1

Tatu Saloranta edited this page Jan 27, 2026 · 153 revisions

Jackson Version 3.1 is being developed, as of October 2025.

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.

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
  • #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)
  • #221: Support alternate radixes when writing numeric values as strings
  • #650: @JsonUnwrapped prevents checks for DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
  • #1196: Add support for collecting multiple deserialization failures during processing, not just first one
  • #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
  • #3284: Backward compatibility for timezone formats of UTC Date serialization
  • #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)
  • #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
  • #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
  • 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)

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

Changes, data types

Guava

  • #211: GuavaMultimapDeserializer does not respect JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY

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

N/A

Clone this wiki locally