package com.fasterxml.jackson.databind.format;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.*;
@SuppressWarnings("serial")
public class MapFormatShapeTest extends BaseMapTest
{
@JsonPropertyOrder({ "extra" })
static class Map476Base extends LinkedHashMap<String,Integer> {
public int extra = 13;
}
@JsonFormat(shape=JsonFormat.Shape.OBJECT)
static class Map476AsPOJO extends Map476Base { }
@JsonPropertyOrder({ "a", "b", "c" })
@JsonInclude(JsonInclude.Include.NON_NULL)
static class Bean476Container
{
public Map476AsPOJO a;
public Map476Base b;
@JsonFormat(shape=JsonFormat.Shape.OBJECT)
public Map476Base c;
public Bean476Container(int forA, int forB, int forC) {
if (forA != 0) {
a = new Map476AsPOJO();
a.put("value", forA);
}
if (forB != 0) {
b = new Map476Base();
b.put("value", forB);
}
if (forC != 0) {
c = new Map476Base();
c.put("value", forC);
}
}
}
static class Bean476Override
{
@JsonFormat(shape=JsonFormat.Shape.NATURAL)
public Map476AsPOJO stuff;
public Bean476Override(int value) {
stuff = new Map476AsPOJO();
stuff.put("value", value);
}
}
// from [databind#1540]
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@JsonPropertyOrder({ "property", "map" })
static class Map1540Implementation implements Map<Integer, Integer> {
public int property;
public Map<Integer, Integer> map = new HashMap<>();
public Map<Integer, Integer> getMap() {
return map;
}
public void setMap(Map<Integer, Integer> map) {
this.map = map;
}
@Override
public Integer put(Integer key, Integer value) {
return map.put(key, value);
}
@Override
public int size() {
return map.size();
}
@JsonIgnore
@Override
public boolean isEmpty() {
return map.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return map.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return map.containsValue(value);
}
@Override
public Integer get(Object key) {
return map.get(key);
}
@Override
public Integer remove(Object key) {
return map.remove(key);
}
@Override
public void putAll(Map<? extends Integer, ? extends Integer> m) {
map.putAll(m);
}
@Override
public void clear() {
map.clear();
}
@Override
public Set<Integer> keySet() {
return map.keySet();
}
@Override
public Collection<Integer> values() {
return map.values();
}
@Override
public Set<java.util.Map.Entry<Integer, Integer>> entrySet() {
return map.entrySet();
}
}
/*
/**********************************************************
/* Test methods, serialization
/**********************************************************
*/
final private ObjectMapper MAPPER = objectMapper();
// for [databind#476]: Maps as POJOs
public void testSerializeAsPOJOViaClass() throws Exception
{
String result = MAPPER.writeValueAsString(new Bean476Container(1,2,0));
assertEquals(aposToQuotes("{'a':{'extra':13,'empty':false},'b':{'value':2}}"),
result);
}
// Can't yet use per-property overrides at all, see [databind#1419]
/*
public void testSerializeAsPOJOViaProperty() throws Exception
{
String result = MAPPER.writeValueAsString(new Bean476Container(1,0,3));
assertEquals(aposToQuotes("{'a':{'extra':13,'empty':false},'c':{'empty':false,'value':3}}"),
result);
}
public void testSerializeNaturalViaOverride() throws Exception
{
String result = MAPPER.writeValueAsString(new Bean476Override(123));
assertEquals(aposToQuotes("{'stuff':{'value':123}}"),
result);
}
*/
/*
/**********************************************************
/* Test methods, deserialization/roundtrip
/**********************************************************
*/
// [databind#1540]
public void testRoundTrip() throws Exception
{
Map1540Implementation input = new Map1540Implementation();
input.property = 55;
input.put(12, 45);
input.put(6, 88);
String json = MAPPER.writeValueAsString(input);
assertEquals(aposToQuotes("{'property':55,'map':{'6':88,'12':45}}"), json);
Map1540Implementation result = MAPPER.readValue(json, Map1540Implementation.class);
assertEquals(result.property, input.property);
assertEquals(input.getMap(), input.getMap());
}
// [databind#1554]
public void testDeserializeAsPOJOViaClass() throws Exception
{
Map476AsPOJO result = MAPPER.readValue(aposToQuotes("{'extra':42}"),
Map476AsPOJO.class);
assertEquals(0, result.size());
assertEquals(42, result.extra);
}
}