From a5c3179cd168c459879b6ea17a89d31041ca7893 Mon Sep 17 00:00:00 2001 From: asmhatre Date: Tue, 4 Aug 2026 17:29:51 +0000 Subject: [PATCH] Part 1 extra: POJOs serialise alphabetically, records do not --- .../B04PropertyOrdering.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/main/java/com/ankurm/jackson3/part1objectmapper/B04PropertyOrdering.java diff --git a/src/main/java/com/ankurm/jackson3/part1objectmapper/B04PropertyOrdering.java b/src/main/java/com/ankurm/jackson3/part1objectmapper/B04PropertyOrdering.java new file mode 100644 index 0000000..101d474 --- /dev/null +++ b/src/main/java/com/ankurm/jackson3/part1objectmapper/B04PropertyOrdering.java @@ -0,0 +1,50 @@ +package com.ankurm.jackson3.part1objectmapper; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import tools.jackson.databind.json.JsonMapper; + +/** + * BEYOND THE POST — no blog section covers this, but it bites on first run. + * + * A record serialises in declaration order. A getter-based POJO serialises in + * ALPHABETICAL order. If you are diffing Jackson output against a fixture, this + * is usually the reason the diff is not empty. + */ +public class B04PropertyOrdering { + + /** Getter-based POJO: output is alphabetical, NOT declaration order. */ + public static class ProductPojo { + private Long productId; + private String productName; + private double listPrice; + public ProductPojo(Long i, String n, double p) { productId = i; productName = n; listPrice = p; } + public Long getProductId() { return productId; } + public String getProductName() { return productName; } + public double getListPrice() { return listPrice; } + } + + /** Record: output follows the component declaration order. */ + public record ProductRecord(Long productId, String productName, double listPrice) { } + + /** Explicit ordering wins over both defaults. */ + @JsonPropertyOrder({ "productId", "productName", "listPrice" }) + public static class ProductOrdered { + private final Long productId; + private final String productName; + private final double listPrice; + public ProductOrdered(Long i, String n, double p) { productId = i; productName = n; listPrice = p; } + public Long getProductId() { return productId; } + public String getProductName() { return productName; } + public double getListPrice() { return listPrice; } + } + + public static void main(String[] args) { + JsonMapper mapper = JsonMapper.builder().build(); + System.out.println("POJO : " + mapper.writeValueAsString( + new ProductPojo(1L, "Mechanical Keyboard", 79.99))); + System.out.println("record : " + mapper.writeValueAsString( + new ProductRecord(1L, "Mechanical Keyboard", 79.99))); + System.out.println("ordered : " + mapper.writeValueAsString( + new ProductOrdered(1L, "Mechanical Keyboard", 79.99))); + } +}