CollectionFormatShapeTest.java
package com.fasterxml.jackson.databind.format;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CollectionFormatShapeTest extends DatabindTestUtil
{
// [databind#40]: Allow serialization 'as POJO' (resulting in JSON Object)
@JsonPropertyOrder({ "size", "value" })
@JsonFormat(shape=Shape.OBJECT)
@JsonIgnoreProperties({
"empty", // from 'isEmpty()'
"first", "last" // JDK 21 additions
})
static class CollectionAsPOJO
extends ArrayList<String>
{
private static final long serialVersionUID = 1L;
@JsonProperty("size")
public int foo() { return size(); }
public List<String> getValues() {
return new ArrayList<String>(this);
}
public void setValues(List<String> v) {
addAll(v);
}
// bogus setter to handle "size" property
public void setSize(int i) { }
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
private final static ObjectMapper MAPPER = newJsonMapper();
@Test
public void testListAsObjectRoundtrip() throws Exception
{
// First, serialize a "POJO-List"
CollectionAsPOJO list = new CollectionAsPOJO();
list.add("a");
list.add("b");
String json = MAPPER.writeValueAsString(list);
// 2023-10-17, tatu: JDK 21 introduced new properties, so check
// just that we have certain things, ignore extra
JsonNode doc = MAPPER.readTree(json);
//assertEquals("{\"size\":2,\"values\":[\"a\",\"b\"]}", json);
assertEquals(2, doc.path("size").intValue());
assertEquals("[\"a\",\"b\"]", doc.path("values").toString());
// and then bring it back!
CollectionAsPOJO result = MAPPER.readValue(json, CollectionAsPOJO.class);
assertEquals(2, result.size());
}
}