From a3beb326ef36f8af706311a3af0e48bcced2031d Mon Sep 17 00:00:00 2001 From: asmhatre Date: Tue, 4 Aug 2026 17:30:52 +0000 Subject: [PATCH] Part 3: @JsonInclude and @JsonFormat; ISO-8601 is already the default --- .../D02InclusionAndFormat.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/com/ankurm/jackson3/part3annotations/D02InclusionAndFormat.java diff --git a/src/main/java/com/ankurm/jackson3/part3annotations/D02InclusionAndFormat.java b/src/main/java/com/ankurm/jackson3/part3annotations/D02InclusionAndFormat.java new file mode 100644 index 0000000..1b8b39b --- /dev/null +++ b/src/main/java/com/ankurm/jackson3/part3annotations/D02InclusionAndFormat.java @@ -0,0 +1,46 @@ +package com.ankurm.jackson3.part3annotations; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonInclude; +import tools.jackson.databind.json.JsonMapper; + +import java.time.LocalDate; +import java.util.List; + +/** + * Post: Jackson Annotations Cheat Sheet — https://ankurm.com/jackson-annotations-guide/ + * Sections: "@JsonInclude" and "@JsonFormat" + * + * One correction to the post: it says "Without @JsonFormat, Jackson writes LocalDate + * as a numeric array by default." That was true in Jackson 2. In Jackson 3, java.time + * support is built in and ISO-8601 is the default — the annotation is only needed for + * a NON-standard pattern. The `defaultDate` field below proves it. + */ +public class D02InclusionAndFormat { + + @JsonInclude(JsonInclude.Include.NON_NULL) + public record ProductDetails(String productName, String productDescription, Double discountRate) { } + + @JsonInclude(JsonInclude.Include.NON_EMPTY) + public record CompactProduct(String productName, String notes, List tags) { } + + public record InvoiceRecord( + Long invoiceId, + LocalDate defaultDate, // no annotation + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy") + LocalDate ukStyleDate, // custom pattern + @JsonFormat(shape = JsonFormat.Shape.STRING) + double totalAmount) { } // number as string + + public static void main(String[] args) { + JsonMapper mapper = JsonMapper.builder().build(); + + System.out.println("NON_NULL : " + + mapper.writeValueAsString(new ProductDetails("Keyboard", null, null))); + System.out.println("NON_EMPTY : " + + mapper.writeValueAsString(new CompactProduct("Keyboard", "", List.of()))); + + System.out.println("formats : " + mapper.writeValueAsString(new InvoiceRecord( + 500L, LocalDate.of(2026, 4, 9), LocalDate.of(2026, 4, 9), 199.99))); + } +}