-
Notifications
You must be signed in to change notification settings - Fork 6
JSTEP 2
(Back to JSTEP page)
Tatu Saloranta (@cowtowncoder)
- 2025-07-24: Update wrt revert of default change for
JsonWriteFeature.ESCAPE_FORWARD_SLASHES
default - 2025-05-12: Update wrt CBOR read/write feature defaults - @cowtowncoder
- 2025-05-05: Update wrt
DeserializationFeature.FAIL_ON_UNEXPECTED_VIEW_PROPERTIES
revert - @cowtowncoder - 2025-05-03: Update wrt
MonthSerializer
andMonthDeserializer
behavior change - @JooHyukKim - 2025-04-08: Added
DateTimeFeature.ONE_BASED_MONTHS
- @cowtowncoder - 2025-04-06: Added
MapperFeature.OVERRIDE_PUBLIC_ACCESS_MODIFIERS
- @cowtowncoder - 2025-02-05: Updates wrt
XmlWriteFeature
default changes - @cowtowncoder - 2025-02-01: Update wrt
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
default change - @cowtowncoder - 2025-01-31: Update wrt
SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS
default change - @cowtowncoder - 2025-01-29: Update wrt
DeserializationFeature.FAIL_ON_TRAILING_TOKENS
default change - @cowtowncoder - 2025-01-19: Add Kotlin module proposed change links - @cowtowncoder
- 2024-07-21:
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
default changed - @cowtowncoder - 2024-06-06:
DeserializationFeature.READ_ENUMS_USING_TO_STRING
,SerializationFeature.WRITE_ENUMS_USING_TO_STRING
defaults changed - @cowtowncoder - 2024-05-31:
MapperFeature.ALLOW_FINAL_FIELDS_AS_MUTATORS
default changed - @cowtowncoder - 2019-02-10: create first version from earlier notes - @cowtowncoder
Mostly complete for 3.0.0-rc6 (2025-07-18) but will remain technically open until 3.0.0 release
During Jackson 2.x development, certain default settings have proven either problematic by development team, or non-intuitive/non-optimal by users: latter indicated both by filed issues and comments on mailing list discussions. Since default settings and behavior are important part of the public API, changes have had to wait until major version change in most cases.
This document details proposed/planned as well as implemented changes.
Changes to jackson-core defaults
No changes
No changes
- NOTE: initially planned change to
JsonWriteFeature.ESCAPE_FORWARD_SLASHES
defaults were rolled back in3.0.0-rc7
-
DEFAULT_MAX_DEPTH
to 500 (from 1,000) (see core#1233)
-
DEFAULT_MAX_DEPTH
to 500 (from 1,000) (see core#1233)
-
USE_FAST_DOUBLE_PARSER
: enabled by default in 3.0 (see core#1231) -
USE_FAST_BIG_NUMBER_PARSER
: enabled by default in 3.0 (see core#1231)
-
USE_FAST_DOUBLE_WRITER
: enabled by default in 3.0 (see core#1231)
Changes to jackson-databind defaults
First, following deprecated features have been removed from 3.0:
-
USE_STD_BEAN_NAMING
: should always be enabled, no need for old slightly differing algorithm -
AUTO_DETECT_xxx
: old limited settings superceded by more granular settings -- frees up 5 features
And defaults to following features have been changed:
-
ALLOW_FINAL_FIELDS_AS_MUTATORS
: default tofalse
-- while enabling may be useful sometimes, it confuses users in general and is unlikely to even work with future JDKs/JVMs -
DEFAULT_VIEW_INCLUSION
: default tofalse
: has been requested by users and change initially approved -
USE_GETTERS_AS_SETTERS
: default tofalse
-- earlier default was based on JAXB but is quite confusing for users -
SORT_PROPERTIES_ALPHABETICALLY
: default totrue
(false
really doesn't make much sense since it is unstable, and arbitrary based on JVM/JDK)
Changes, potential:
-
OVERRIDE_PUBLIC_ACCESS_MODIFIERS
: default tofalse
since benefits of enabling seem small if not non-existent with 3.0
Changes completed:
-
FAIL_ON_UNKNOWN_PROPERTIES
: default tofalse
(TOP REQUEST by users) databind#493 -
READ_ENUMS_USING_TO_STRING
: default totrue
(instead offalse
that relies onname()
) databind#4566- NOTE: this was further renamed/moved as
EnumFeature.READ_ENUMS_USING_TO_STRING
(via databind#5079)
- NOTE: this was further renamed/moved as
-
FAIL_ON_NULL_FOR_PRIMITIVES
: default totrue
(databind#4858)- Setting to
false
would allowing coercion from JSON null into Java int, long and so on. For some users, and especially on "low null" languages like Kotlin, such coercion is rarely expected.
- Setting to
-
FAIL_ON_TRAILING_TOKENS
: default totrue
(databind#3406)
Changes planned but not made (or were reverted):
-
FAIL_ON_UNEXPECTED_VIEW_PROPERTIES
: default remainsfalse
for 3.0- Feature added for databind#437, via databind#4275
Changes completed:
-
WRITE_ENUMS_USING_TO_STRING
: default totrue
(to keep symmetry between itsDeserializationFeature.READ_ENUMS_USING_TO_STRING
counterpart) databind#4567- NOTE: this was further renamed/moved as
EnumFeature.WRITE_ENUMS_USING_TO_STRING
(via databind#5080)
- NOTE: this was further renamed/moved as
-
FAIL_ON_EMPTY_BEANS
: default tofalse
databind#3070 -
FAIL_ON_ORDER_MAP_BY_INCOMPARABLE_KEY
: was added in 2.19. Changed default in 3.0 via databind#4781 -
WRITE_DURATIONS_AS_TIMESTAMPS
: change default tofalse
to serialize as ISO-8601 String -- databind#4846- Note: renamed/moved as
DateTimeFeature.WRITE_DURATIONS_AS_TIMESTAMPS
- Note: renamed/moved as
- Writing date/time values as ISO-8601 Strings instead of (Java style) timestamps
-
WRITE_DATES_AS_TIMESTAMPS
: change default tofalse
to serialize as ISO-8601 String -- databind#4845- Note: renamed/moved as
DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS
- Note: renamed/moved as
-
WRITE_DATE_KEYS_AS_TIMESTAMPS
: RETAIN default offalse
-- no change- Note: renamed/moved as
DateTimeFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS
- Note: renamed/moved as
-
Changes completed:
-
ONE_BASED_MONTHS
: default totrue
(3.0.0-rc3) - Moved entries from
DeserializationFeature
:ADJUST_DATES_TO_CONTEXT_TIME_ZONE
,READ_DATE_TIMESTAMPS_AS_NANOSECONDS
- Moved entries from
SerializationFeature
(WRITE_DATE_xxx
and similar)
Changes to CBOR defaults
-
CBORReadFeature
: -
CBORWriteFeature
:-
CBORWriteFeature.ENCODE_USING_STANDARD_NEGATIVE_BIGINT_ENCODING
: change default totrue
CBOR#582
-
Changes to XML defaults
-
XmlWriteFeature
NOTE: see above for databind DateTimeFeature
changes.
Changes to defaults proposed:
- Disable
lenient
setting (that is: default to "strict") - Check defaults of date/time handling
Changes to jackson-module-kotlin defaults
Kotlin module has a few proposed/accept changes.
-
Discussion of changes to default behavior in
Jackson 3.0
(Parent/Overall discussion) -- and specific sub-issues:
-
DecimalNode
creation viaJsonNodeFactory
: default to NOT truncating trailing zeroes (minimal trimming), becauseJsonNode
should by default expose content as close to way it came.
MonthSerializer
and MonthDeserializer
behavior change (databind#5127)
- In 2.x,
java.time.Month
was handled as plainEnum
and was applied withEnum
-related handling such asEnumFeature.WRITE_ENUMS_USING_INDEX
orEnumFeature.WRITE_ENUMS_USING_TO_STRING
. - Starting 3.x, along with
java-time
merging todatabind
module, it's now handled like regular date/time classes, defaulting to number as value.