-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Jackson Release 3.0
Jackson Version 3.0 is a Major New version, released on October 3, 2025. It had been in development since late 2017. Multiple Release Candidates were published before official 3.0.0.
3.0 is a major version update and thereby not API compatible with 2.x; however, since 2.10 new methods have been added in 2.x line to reduce incompatibilities.
Overall plans are outlined in JSTEP-1
Branch is open for patch releases.
It is not designated a Long-Term-Support (LTS) version.
Following pre-release versions were released:
-
3.0.0-rc1(07-Mar-2025) -
3.0.0-rc2(28-Mar-2025) -
3.0.0-rc3(13-Apr-2025) -
3.0.0-rc4(10-May-2025)- SBOM publishing
-
3.0.0-rc5(22-May-2025)- Publishing via new Sonatype Central
- SBOM publishing broke for some reason, wrt ^^^
-
3.0.0-rc6(18-Jul-2025)- note: switch to
jackson-annotationsv2.x (specifically,2.19.2for this RC) -- no more 3.0 variant released
- note: switch to
-
3.0.0-rc7(08-Aug-2025)-
jackson-annotations2.20-rc1
-
-
3.0.0-rc8(13-Aug-2025) -
3.0.0-rc9(05-Sep-2025)-
jackson-annotations2.20
-
-
3.0.0-rc10(19-Sep-2025)
- Jackson 3 Migration Guide -- Work-in-Progress
By Jackson project:
- Jackson 3.0 Vision (jan 2021)
- Taking Jackson 3.0.0-rc1 for a spin
- Towards Jackson 3: on 3.0.0-rc9
- Jackson 3.0.0 GA Released
- Why Upgrade to Jackson 3?
External:
Java 17 is now required for all 3.x components.
NOTE: jackson-annotations not affected as Jackson 3.x uses 2.x variant (2.20) of jackson-annotations.
From 2.20 baseline of:
- SDK / API Level 26
to 3.0 baseline of:
- SDK / API Level 34 (for Records)
(see https://apilevels.com/ for details on levels)
- databind#2882: Tighten accessor naming rules to not allow leading lower-case or non-letter character for getters/setters
- Renaming of artifacts (as per JSTEP-1)
- Maven group-ids: from "com.fasterxml.jackson" to "tools.jackson"
- except for
jackson-annotations(since 2.x version used by 3.x components)
- except for
- Java packages: from "com.fasterxml.jackson" to "tools.jackson"
- except for
jackson-annotations(since 2.x version used by 3.x components)- but note that annotations in other packages (
jackson-databind,jackson-dataformat-xml) do get renamed as part of package
- but note that annotations in other packages (
- except for
- Maven group-ids: from "com.fasterxml.jackson" to "tools.jackson"
- Removal of all deprecated methods, functionality, as of 2.x
- Removed format-auto-detection (interesting idea but not widely used and few formats beyond JSON, XML, Smile, Avro support detection)
- Major renaming of core entities (see JSTEP-6)
- Changes to many Configuration defaults, esp. "XxxFeature"s (see JSTEP-2)
- Native use of
module-info.java, instead of baking in via Moditect module (as per JSTEP-11) - All 3 "Java 8 modules", that were separate in Jackson 2.x, are now built-in to
jackson-databind(no need to register separately)-
jackson-module-parameter-names: auto-detection of Constructor parameter names -
jackson-datatype-jdk8: support forjava.util.Optionaland other optional types (OptionalDouble, ...) -
jackson-datatype-jsr310: supportjava.timetypes (added in 3.0.0-rc3)
-
- Full immutability of core entities, via Builder-style construction
-
TokenStreamFactory(oldJsonFactory) -
ObjectMapper(addition of format-specific sub-classes, fromJsonMappertoXmlMapper) - Note Jackson 2.10 and later also support most of Builder-style construction but without strict guarantees of immutability of underlying entities (due to backwards-compatibility reasons)
- See Jackson 3 immutability with builders
-
- Tighter integration between Streaming and Databinding to allow improved support of non-JSON formats
-
ObjectMapperremains shared API, but every format will have its own mapper subtype, includingJsonMapperfor JSON- Partly implemented in 2.x since 2.10, to support Builder-style construction (albeit without immutability)
- Format-specific mapper will (have to) use format-specific
TokenStreamFactory
-
- Unchecked exceptions (see JSTEP-4)
- Base 2.x exceptions will be replaced with new counterparts as follows (counterparts will be added in 2.x but mostly used in 3.0)
-
JsonProcessingException(root exception) becomesJacksonException -
JsonParseException/JsonGenerationException(streaming) will becomeStreamReadException/StreamWriteException -
JsonMappingException(root for databind exceptions) becomesDatabindException - While new exceptions will be added by Jackson 2.13, their use is limited: they CAN be caught but NOT thrown (sort of "read-only" upgrade) while retaining compatibility across minor versions
- Deprecation of unmaintained modules: as per JSTEP-9, 2 modules without maintainer are deprecated and not migrated (at least yet):
-
JSON Schema module (
jackson-module-jsonSchema) -- Obsolete, no plans to migrate -
Hibernate Datatype module(s) (
jackson-datatype-hibernateX) -- unmaintained, but if new maintainer(s) found, could be migrated to 3.x
-
JSON Schema module (
- YAML module uses
snakeyaml-engineover "classic"snakeyaml
Separate 3.x no longer maintained or released (since 3.0.0-rc6).
Jackson 3.0 depends on jackson-annotations 2.20.
- #402: Remove dataformat-auto-detection functionality
-
#413: Remove
ObjectCodec: replace withObjectWriteContext/ObjectReadContext -
#551: Remove
JsonGenerator.setPrettyPrinter()from 3.0 -
#676: Remove
JsonGenerator.canWriteBinaryNatively(),canWriteFormattedNumbers()(replaced byStreamWriteCapabilityequivalents) - #689: Remove existing "request payload" functionality
-
#1090: Remove
BufferRecyclers.SYSTEM_PROPERTY_TRACK_REUSABLE_BUFFERS -
#1125: Remove
TokenStreamFactory.Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING -
#1463: Remove
URLtaking factory methods ofJsonFactory(3.0)
-
#411: Rename
JsonStreamContextasTokenStreamContext -
#663: Rename
JsonEOFExceptionasUnexpectedEndOfInputException -
#670: Replace references to "field" in
JsonGenerator,JsonParsermethod names with "property" -
#671: Rename
getCurrentLocation()/getTokenLocation()ascurrentLocation()/currentTokenLocation() - #793: Rename "com.fasterxml.jackson" -> "tools.jackson"
-
#1364: Rename
JsonLocationasTokenStreamLocation[JSTEP-6] -
#1373: Change
TreeNode.propertyNames()return type fromIterator<JsonNode>toCollection<JsonNode>(3.0) -
#1378: Rename
JsonParser.getText()as.getString()[JSTEP-6] -
#1401: Rename
TreeNode.isContainerNode()asisContainer() - Rename
JsonGenerator.Feature.AUTO_CLOSE_JSON_CONTENTasAUTO_CLOSE_CONTENT
-
#378: Change default for
TokenStreamFactory.Feature.INTERN_FIELD_NAMEStofalse - #1231: Enable Fast Floating-Point reading/writing by default in 3.0
-
#1233: Lower default
maxNestingDepthofStreamReadConstraints/StreamWriteConstraintsto 500 in 3.0
-
#432: Add new
TreeNodesubtypes:ArrayTreeNode,ObjectTreeNode - #433: Add Builder pattern for creating configured Stream factories
-
#456: Add
JsonParser.readAsValue(ResolvedType) - #492: Ensure primitive type names in error message enclosed in backticks
-
#661: Replace checked
JsonProcessingExceptionwith uncheckedJacksonException -
#668: Add
JacksonException.Reference(demote fromJsonMappingException/DatabindException) -
#680: Allow use of
java.nio.file.Pathas parser source, generator target -
#785: Make
JsonGenerator.writeXxx()methods chainable -
#1269: Change
JsonFactory.builder()configuration ofRecyclerPoolto avoid allocating default implementation (in 3.0) -
#1380: Change 3.0 to use
module-info.javadirectly (and not via Moditect) -
#1411: Add
JsonFactoryBuilder.configureForJackson2(),JsonFactoryBuilder builderWithJackson2Defaults() -
#1434: Change
JsonParser.getNumberType()to returnnullinstead of throwing exception in 3.0 -
#1480: Add
JsonGenerator.getPrettyPrinter() - Add
TreeCodec.nullNode(),TreeNode.isNull()methods - Change the way
JsonLocation.NAis included in exception messages
-
#1772: Remove
MapperFeature. USE_STD_BEAN_NAMING -
#1773: Remove
MapperFeature.AUTO_DETECT_xxxfeatures -
#1917: Remove
canSerialize()andcanDeserialize()methods fromObjectMapper -
#1973: Remove support for "default [Map] key serializer" configuration from
SerializerProvider -
#2040: Remove
JsonSerializer.isEmpty() -
#4160: Deprecate
DefaultTyping.EVERYTHINGin2.xand remove in3.0 -
#4659: Remove use of global static
TypeFactorysingleton from 3.0 -
#4875: Remove
JsonNode.fields()from 3.0 -
#5263: Remove deprecated
URL-takingreadValue()methods inObjectMapper,ObjectReaderfrom 3.0 -
#5270: Remove
ObjectMapper.setSerializationInclusion()from 3.0 (deprecate in 2.20) - Remove
MappingJsonFactory -
#4589: Remove
MapperFeature.SORT_CREATOR_PROPERTIES_BY_DECLARATION_ORDERfrom 3.0; make logic default -
#4835: Remove dynamic work-arounds wrt accessing
Recorddefinition
-
#2713: Change wording of
UnrecognizedPropertyExceptionto refer to "property" not "field" -
#3037: Rename
ModuleasJacksonModulein 3.0 (to avoid overlap withjava.lang.Module) -
#3043: Rename
SerializerProviderasSerializationContext -
#3044: Rename
JsonDeserializer/JsonSerializerasValueDeserializer/ValueSerializer -
#3046: Rename
JsonSerializableasJacksonSerializable -
#3047: Rename
Bean[De]SerializerModifierasValue[De]SerializerModifier -
#4818: Rename
AnnotationIntrospector.findDefaultCreator()asfindPreferredCreator() -
#4879: Rename
TextNodeasStringNode;JsonNode.xxxTextYyy()(mostly) asJsonNode.xxxStringYyy()[JSTEP-3] -
#4956: Rename
JsonNode.isContainerNode()asisContainerNode() -
#4992: Rename
JsonNodeFactory.textNode()asJsonNodeFactory.stringNode()[JSTEP-3] -
#5066: Move date/time
SerializationFeatures intoDateTimeFeature(3.0) -
#5067: Move date/time
DeserializationFeatures intoDateTimeFeature(3.0) -
#5079: Move Enum-related
DeserializationFeatures intoEnumFeature(3.0) -
#5080: Move Enum-related
SerializationFeatures intoEnumFeature(3.0) -
#5272: Replace
ObjectMapper.getRegisteredModuleIds()(2.x) withObjectMapper.registeredModules()(3.0)
-
#493: Change
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIESdefault tofalse -
#1484: Change default of
MapperFeature.DEFAULT_VIEW_INCLUSIONtofalsein 3.0 -
#1916: Change
MapperFeature.USE_GETTERS_AS_SETTERS)default tofalse -
#3070: Disable
SerializationFeature.FAIL_ON_EMPTY_BEANSby default -
#3406: Change default of
DeserializationFeature.FAIL_ON_TRAILING_TOKENStotruefor 3.0 -
#4552: Change
MapperFeature.ALLOW_FINAL_FIELDS_AS_MUTATORSdefault tofalse -
#4566: Enable
DeserializationFeature.READ_ENUMS_USING_TO_STRINGby default -
#4567: Enable
SerializationFeature.WRITE_ENUMS_USING_TO_STRINGby default -
#4572: Change
MapperFeature.SORT_PROPERTIES_ALPHABETICALLYdefault to true (3.x) -
#4845: Change default of
SerializationFeature.WRITE_DATES_AS_TIMESTAMPStofalsein 3.0 -
#4846: Change default of
SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPStofalsein 3.0 -
#4858: Change default of
DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVEStotruefor 3.0 -
#5065: Change default for
DateTimeFeature.ONE_BASED_MONTHStotruein 3.0
- #1600: Serializing locale with underscore, not standard hyphen
-
#1762:
StdDateFormat: serialize time offset using colon -
#1774: Merge Java8 datatype (
Optional,Stream) support in core databind -
#1775: Merge Java8 parameter name support (
jackson-module-parameter-names) in core databind -
#1781: Return
ObjectNodefromObjectNodeset-methods in order to allow better chaining -
#1829:
JsonNode.deepCopy()ClassCastException`s -
#1888: Merge
ResolvableSerializerintoJsonSerializer,ResolvableDeserializerintoJsonDeserializer -
#1889: Merge
ContextualSerializerintoJsonSerializer,ContextualDeserializerintoJsonDeserializer -
#1994: Limit size of
SerializerCache, auto-flush on exceeding -
#1995: Limit size of
DeserializerCache, auto-flush on exceeding -
#2083: Replace Reflection usage with
MethodHandle(3.0) -
#2177: Change parent type of
JsonProcessingExceptionto beRuntimeException -
#2405: Make
java.sql.Dateserializer default to same output asjava.util.Date - #2593: StackTraceElement w/ >= Java 9 doesn't deserialize properly
- #2882: Tighten accessor naming rules to not allow leading lower-case or non-letter character for getters/setters
-
#3028: Change
UUIDSerializerto useStreamWriteCapabilitycheck instead ofJsonGenerator.canWriteBinaryNatively() -
#3561: Add
DeserializationContextas an argument forSettableBeanProperty.set(...) -
#3601: Change
Optionaldeserialization from "absent" value intonull, from "empty" -
#4381: Prevent construction of
null-valuedJsonNodes (likeTextNode) -
#4603: Keep full stacktrace when re-throwing exception with
DatabindExceptionduring deserialization -
#4664: Change
EnumNamingStrategy.convertEnumToExternalName()to takeMapperConfigargument - #4840: Increase minimum Android SDK required to 34 for Jackson 3.0
-
#4891: Change 3.0 to use
module-info.javadirectly for build (instead of via Moditect) -
#4907: Reduce/eliminate introspection on
java.*classes -
#4958: Extend, improve set of number value accessors for
JsonNode(JsonNode.intValue()etc) [JSTEP-3] -
#4991: Extend, improve set of non-number scalar value accessors for
JsonNode(JsonNode.booleanValue()etc) [JSTEP-3] -
#5003: Extend, improve set of
JsonNode.asXxx()methods for number types -
#5034: Extend, improve set of
JsonNode.asXxx()methods for non-number types (Boolean, String) -
#5078: Create proper
MonthDeserializerandMonthSerializer(don't rely onEnumDeserializer/EnumSerializer) -
#5093: Change the way
BeanDescriptionpassed during serializer construction to useSupplier -
#5094: Change the way
BeanDescriptionpassed during deserializer construction to useSupplier - #5138: add asShort(), asFloat() conversion methods
-
#5153: Improve error handling for numeric values in
POJONode - #5158: Add "optional" variants -- shortValueOpt(), floatValueOpt(), asShortOpt(), asFloatOpt()
-
#5169: Add missing methods in
Serializersfor Enum and TreeNode types (3.0) -
#5244: Support accessing annotations via
AnnotatedMember.annotations() -
#5287: Change
JsonNode.stringValue()ofNullNodeto returnnull, not fail (3.0) -
#5302: Add one more parameter for
AnnotationIntrospector.findPreferredCreator()method
- #1058: Add a way to pass standard and format-specific parser/generator flags during parser/generation construction
-
#1789: Add
createGeneratormethods inObjectMapper,ObjectWriter -
#1790: Add
createParsermethods inObjectMapper,ObjectReader -
#1883: Add "abstract type mapping" for deserialization from
Map<ENUMTYPE,V>intoEnumMap(andSet<ENUMTYPE>toEnumSet<EnumType>) -
#1954: Add Builder pattern for creating configured
ObjectMapperinstances -
#1955: Change the way
Modules configure, interact withObjectMapper -
#2013: Allow use of
java.nio.file.PathforreadValue(),writeValue() -
#2176: Add
JsonMapper.shared()static method -
#2382: Support
AutoCloseablewithSerializationFeature.CLOSE_CLOSEABLE -
#2411: Allow
valueToTree()viaSerializationContext, add toObjectWriter -
#2539: Add
Deserializers.hasDeserializerFor()(and something forDeserializerFactory) to allow detection of explicitly supported types -
#2828: Add
DatabindExceptionas intermediate subtype ofJsonMappingException -
#3522: Support serializing
ByteArrayOutputStreamas "simple" Binary value -
#3536: Create new exception type
JsonNodeExceptionfor use byJsonNode-related problems -
#5004: Add
JsonMapper.builderWithJackson2Defaults() -
#5025: Add support for automatic detection of subtypes (like
@JsonSubTypes) from Java 17 sealed types -
#5032: Merge
jackson-datatype-jsr310functionality into jackson-databind -
#5110: Add missing
ObjectMapper#createNonBlockingByteBufferParser()method -
#5111: Improve support for deserializing from
TokenBuffer(f.ex for content buffered for non-blocking parsing) -
#5112: Add a
MapperBuilder#findAndAddModules(ClassLoader)variant -
#5314: Add
MapperFeature.DETECT_PARAMETER_NAMESto allow disablingparameter-namesfunctionality - #5318: Allow auto-detection of Properties-based Constructor even if class has no-parameters (default) Constructor
-
#4310:
ParameterNamesModulecauses@ConstructorPropertiesto be ignored, constructor called with null value -
#5231: Deserialization through setter with
varargparameter failsClassCastException -
#5309: Confusing exception for
DoubleNodetoIntegerconversion in Jackson 3 -
#5319:
TreeTraversingParserdoes not respectDeserializationFeature.ACCEPT_FLOAT_AS_INT
-
#522: JSTEP-8: rename
AvroParser.FeatureasAvroReadFeature,AvroGenerator.FeatureasAvroWriteFeature
-
#524: JSTEP-8: rename
CBORGenerator.FeatureasCBORWriteFeature -
#582: Change defaults for
CBORReadFeature.DECODE_USING_STANDARD_NEGATIVE_BIGINT_ENCODINGandCBORWriteFeature.ENCODE_USING_STANDARD_NEGATIVE_BIGINT_ENCODINGtotrue(enabled) in 3.0 -
#591: Change
CBORFeatures defaults for 3.0
-
#510: JSTEP-8: rename
CsvParser.FeatureasCsvReadFeature,CsvGenerator.FeatureasCsvWriteFeature
-
#526: JSTEP-8: rename
IonParser.FeatureasIonReadFeature,IonGenerator.FeatureasIonWriteFeature
-
#528: JSTEP-8: rename
SmileParser.FeatureasSmileReadFeature,SmileGenerator.FeatureasSmileWriteFeature
-
#687: JSTEP-8: rename
FromXmlParser.FeatureasXmlReadFeature,ToXmlGenerator.FeatureasXmlWriteFeature -
#701: Change 3.0 to use
module-info.javadirectly, remove use of Moditect -
#725: Change
XmlWriteFeature.UNWRAP_ROOT_OBJECT_NODEdefault totrue -
#727: Change
XmlWriteFeature.WRITE_NULLS_AS_XSI_NILdefault totrue -
#728: Change
XmlWriteFeature.AUTO_DETECT_XSI_TYPEdefault totrue -
#729: Change
XmlWriteFeature.WRITE_XML_SCHEMA_CONFORMING_FLOATSdefault totrue -
#731: Support
configureForJackson2()withXmlMapper -
#732: Change
XmlReadFeature.AUTO_DETECT_XSI_TYPEdefault totrue
-
#106: Upgrade to
snakeyaml-engine(from classicsnakeyaml) -
#215:
.without(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)seems to be ignored -
#512: JSTEP-8: rename
YAMLParser.FeatureasYAMLReadFeature,YAMLGenerator.FeatureasYAMLWriteFeature
-
#24: Support for Guava's
Immutable{Double,Int,Long}Array - #69: Add support for Guava primitives during deserialization
-
#65:
jackson-datatype-jsr353SPI class package name wrong
- #26: Improve handling of parent class loader for generated classes
- #29: Use ByteBuddy (instead of "raw" ASM) for Afterburner
- #225: Afterburner 3.0 fails to handle interface "default" methods
- #284: Remove shade plugin from 3.0 Afterburner
- #28: Use ByteBuddy (instead of "raw" ASM) for Mr Bean
-
#123: Change
jackson-module-jaxb-annotationsdependency tooptionalinpom.xmls
- Change
jackson-module-jakarta-xmlbind-annotationsdependency tooptionalinpom.xmls
-
#887: Change 3.0 to use
module-info.javadirectly [JSTEP-11] -
#936:
StrictNullChecksandSingletonSupportare now enabled by default -
#952: The
isRequiredresult fromkotlin-moduleno longer overrides the result fromJacksonAnnotationIntrospectoror otherAnnotationIntrospectors. Tests have confirmed that@JsonProperty(required = true)for nullable parameters has been changed to be determined asrequired.
The jackson-module-scala release notes are listed in its GitHub repository.
The main compatibility issues, other than the tool.jackson package names are
- New ScalaModule builder
- Dropped Scala 2.11 support
- Dropped paranamer dependency