1
0

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.
This commit is contained in:
2026-08-04 23:12:11 +05:30
commit ef05f9024e
94 changed files with 3361 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
package com.ankurm.jackson3.part4custom;
import tools.jackson.core.JsonGenerator;
import tools.jackson.databind.SerializationContext;
import tools.jackson.databind.ValueSerializer;
import tools.jackson.databind.json.JsonMapper;
import tools.jackson.databind.module.SimpleModule;
/**
* BEYOND THE POST — the rename that breaks every custom handler on upgrade.
*
* Jackson 2's JsonSerializer<T>/JsonDeserializer<T> are gone. The Jackson 3 names
* are ValueSerializer<T>/ValueDeserializer<T>. Extending ValueSerializer directly
* (rather than StdSerializer) is the leanest form and shows the rename plainly.
*/
public class E05ValueSerializerDirect {
public record UserId(String value) { }
/** Renders the wrapper as a bare JSON string rather than {"value":"..."}. */
static class UserIdSerializer extends ValueSerializer<UserId> {
@Override
public void serialize(UserId id, JsonGenerator gen, SerializationContext ctxt) {
gen.writeString(id.value());
}
}
public record Ticket(UserId assignee, String title) { }
public static void main(String[] args) {
SimpleModule module = new SimpleModule("UserIdModule");
module.addSerializer(UserId.class, new UserIdSerializer());
JsonMapper mapper = JsonMapper.builder().addModule(module).build();
System.out.println("custom : "
+ mapper.writeValueAsString(new Ticket(new UserId("u-42"), "Fix build")));
System.out.println("default : "
+ JsonMapper.builder().build()
.writeValueAsString(new Ticket(new UserId("u-42"), "Fix build")));
System.out.println("base class: "
+ UserIdSerializer.class.getSuperclass().getName());
}
}