package alien4cloud.utils.jackson; import java.io.IOException; import java.util.Map; import java.util.Map.Entry; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer; /** * Custom serializer that serialize map as an array of {@link MapEntry}. */ public class JSonMapEntryArraySerializer extends StdSerializer<Map<?, ?>> implements ContextualSerializer { private boolean enabled; protected JSonMapEntryArraySerializer() { super(Map.class, false); } public JSonMapEntryArraySerializer(boolean enabled) { super(Map.class, false); this.enabled = enabled; } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void serialize(Map<?, ?> value, JsonGenerator jgen, SerializerProvider provider) throws IOException { if (this.enabled) { MapEntry[] entries = new MapEntry[value.size()]; int i = 0; for (Entry<?, ?> entry : value.entrySet()) { entries[i] = new MapEntry(entry.getKey(), entry.getValue()); i++; } jgen.writeObject(entries); } else { jgen.writeObject(value); } } @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { return new JSonMapEntryArraySerializer(ConditionalEnabledHelper.isEnabled(prov, property)); } }