package com.fasterxml.jackson.databind.ser.jdk;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.core.Base64Variants;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
@SuppressWarnings("serial")
public class MapKeySerializationTest extends BaseMapTest
{
// for [databind#47]
public static class Wat
{
private final String wat;
@JsonCreator
Wat(String wat) {
this.wat = wat;
}
@JsonValue
public String getWat() {
return wat;
}
@Override
public String toString() {
return "(String)[Wat: " + wat + "]";
}
}
static class WatMap extends HashMap<Wat,Boolean> { }
static class DefaultKeySerializer extends JsonSerializer<Object>
{
@Override
public void serialize(Object value, JsonGenerator g, SerializerProvider provider) throws IOException
{
g.writeFieldName("DEFAULT:"+value);
}
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
final private ObjectMapper MAPPER = objectMapper();
// [databind#47]
public void testMapJsonValueKey47() throws Exception
{
WatMap input = new WatMap();
input.put(new Wat("3"), true);
String json = MAPPER.writeValueAsString(input);
assertEquals(aposToQuotes("{'3':true}"), json);
}
// [databind#682]
public void testClassKey() throws IOException
{
Map<Class<?>,Integer> map = new LinkedHashMap<Class<?>,Integer>();
map.put(String.class, 2);
String json = MAPPER.writeValueAsString(map);
assertEquals(aposToQuotes("{'java.lang.String':2}"), json);
}
public void testDefaultKeySerializer() throws IOException
{
ObjectMapper m = new ObjectMapper();
m.getSerializerProvider().setDefaultKeySerializer(new DefaultKeySerializer());
Map<String,String> map = new HashMap<String,String>();
map.put("a", "b");
assertEquals("{\"DEFAULT:a\":\"b\"}", m.writeValueAsString(map));
}
// [databind#1552]
public void testMapsWithBinaryKeys() throws Exception
{
byte[] binary = new byte[] { 1, 2, 3, 4, 5 };
// First, using wrapper
MapWrapper<byte[], String> input = new MapWrapper<>(binary, "stuff");
String expBase64 = Base64Variants.MIME.encode(binary);
assertEquals(aposToQuotes("{'map':{'"+expBase64+"':'stuff'}}"),
MAPPER.writeValueAsString(input));
// and then dynamically..
Map<byte[],String> map = new LinkedHashMap<>();
map.put(binary, "xyz");
assertEquals(aposToQuotes("{'"+expBase64+"':'xyz'}"),
MAPPER.writeValueAsString(map));
}
}