MapFormatShape5405Test.java

package tools.jackson.databind.format;

import java.util.*;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.testutil.DatabindTestUtil;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SuppressWarnings("serial")
public class MapFormatShape5405Test extends DatabindTestUtil
{
    @JsonPropertyOrder({ "extra" })
    static class Map5405Base extends LinkedHashMap<String,Integer> {
        public int extra = 13;
    }

    @JsonFormat(shape=JsonFormat.Shape.POJO)
    static class Map5405AsPOJO extends Map5405Base { }

    @JsonPropertyOrder({ "a", "b", "c" })
    @JsonInclude(JsonInclude.Include.NON_NULL)
    static class Bean5405Container
    {
        public Map5405AsPOJO a;
        public Map5405Base b;
        @JsonFormat(shape=JsonFormat.Shape.POJO)
        public Map5405Base c;

        public Bean5405Container(int forA, int forB, int forC) {
            if (forA != 0) {
                a = new Map5405AsPOJO();
                a.put("value", forA);
            }
            if (forB != 0) {
                b = new Map5405Base();
                b.put("value", forB);
            }
            if (forC != 0) {
                c = new Map5405Base();
                c.put("value", forC);
            }
        }
    }

    static class Bean5405Override
    {
        @JsonFormat(shape=JsonFormat.Shape.NATURAL)
        public Map5405AsPOJO stuff;

        public Bean5405Override(int value) {
            stuff = new Map5405AsPOJO();
            stuff.put("value", value);
        }
    }

    /*
    /**********************************************************************
    /* Test methods, serialization
    /**********************************************************************
     */

    private final ObjectMapper MAPPER = newJsonMapper();

    // [databind#5045]: property overrides for @JsonFormat.shape won't work for Maps
    // 30-Nov-2025, tatu: Something about caching is the issue: if "b" commented out,
    //    override appears to work; with "b" not
    @Test
    public void serializeAsPOJOViaProperty() throws Exception
    {
        String result = MAPPER.writeValueAsString(new Bean5405Container(1,0,3));
        assertEquals(a2q(
                "{'a':{'extra':13,'empty':false},'c':{'extra':13,'empty':false}}"),
                result);
    }

    // [databind#5405]:
    // 01-Dec-2025, JacksonJang: In this case, the @JsonFormat(shape = POJO) override
    // behaves correctly even with b included.
    @Test
    public void serializeAsPOJOViaFullProperty() throws Exception
    {
        String result = MAPPER.writeValueAsString(new Bean5405Container(1,2,3));
        assertEquals(a2q(
                "{'a':{'extra':13,'empty':false},'b':{'value':2},'c':{'extra':13,'empty':false}}"),
                result);
    }

    @Test
    public void serializeNaturalViaOverride() throws Exception
    {
        String result = MAPPER.writeValueAsString(new Bean5405Override(123));
        assertEquals(a2q("{'stuff':{'value':123}}"),
                result);
    }
}