1
0
Files
jackson3-by-example/docs/part0-setup.md
Ankur c438afc33b Jackson 3 series companion code
37 runnable examples covering the eight feature posts on ankurm.com, verified
against Jackson 3.2.1 on Temurin 21.0.5. Every output committed under docs/ was
produced by run-all.sh.

Also documents 11 places where the published snippets do not compile or do not
behave as printed against a real Jackson 3 build - most notably that
writeValueAsString(List<Base>) silently drops the polymorphic type discriminator,
so the post's serialised output cannot be read back.
2026-08-04 23:29:26 +05:30

2.6 KiB

Part 0 — Jackson 101: setup and the ObjectMapper lifecycle

Post: https://ankurm.com/jackson-java-tutorial/

A01 — first round-trip

A01FirstRoundTrip.java

A plain POJO out to JSON and back, using JsonMapper.builder().build() in place of new ObjectMapper(). Note there is no throws clause: Jackson 3 exceptions are unchecked.

{"listPrice":79.99,"productId":1,"productName":"Mechanical Keyboard"}
Mechanical Keyboard

The property order is alphabetical, not declaration order — the post shows productId first. That is not a Jackson 3 change; it is how getter-based POJOs have always been introspected. Records behave differently. See Part 1 / B04.

A02 — the shared mapper

A02SharedMapperConfiguration.java

The post's central rule — build once, share everywhere — is enforced by the API in Jackson 3 rather than left to discipline. Three of the four lines people copy from Jackson 2 configuration are unnecessary or invalid here:

Jackson 2 line Status in Jackson 3
.registerModule(new JavaTimeModule()) Delete. Built in; the class does not exist under tools.jackson.
.registerModule(new Jdk8Module()) Delete. Same.
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) Does not compile. Moved to DateTimeFeature, and already off.
.configure(FAIL_ON_UNKNOWN_PROPERTIES, false) Redundant — already the default.
.setSerializationInclusion(NON_NULL) Replaced by .changeDefaultPropertyInclusion(...).
configured : {"invoiceId":500,"customerName":"Alice","issuedOn":"2026-04-09"}
defaults   : {"invoiceId":500,"customerName":"Alice","issuedOn":"2026-04-09","note":null}
ObjectMapper set*() methods in Jackson 3: 0

The last line is the point: tools.jackson.databind.ObjectMapper has zero set* methods. Reconfiguring a shared mapper is not discouraged in Jackson 3, it is impossible.

A03 — the three processing models

A03ThreeProcessingModels.java

The same payload read by data binding, the tree model and the streaming parser.

1. data binding : Order[orderId=1001, status=SHIPPED]
2. tree model   : orderId=1001 status=SHIPPED
3. streaming    : orderId=1001 status=SHIPPED

For what each approach costs on a real file, see Part 6 / G04.