Skip to content

Commit cc7524c

Browse files
committed
Implemented #307
1 parent 313121b commit cc7524c

File tree

5 files changed

+42
-16
lines changed

5 files changed

+42
-16
lines changed

release-notes/VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ New minor version.
3737
#305: Add support for accessing `TypeFactory` via `TypeIdResolverBase`
3838
(not yet via `TypeIdResolver` interface), other configuration
3939
#306: Allow use of `@JsonFilter` for properties, not just classes
40+
#307: Allow use of `@JsonFilter` for Maps in addition to POJOs
4041
#308: Improve serialization and deserialization speed of `java.util.UUID` by 4x
4142
(suggested by David P)
4243
#310: Improve `java.util.UUID` serialization with binary codecs, to use "raw" form.

src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,9 +728,10 @@ protected JsonSerializer<?> buildMapSerializer(SerializationConfig config,
728728
ser = new EnumMapSerializer(type.getContentType(), staticTyping, enums,
729729
elementTypeSerializer, elementValueSerializer);
730730
} else {
731+
Object filterId = findFilterId(config, beanDesc);
731732
ser = MapSerializer.construct(config.getAnnotationIntrospector().findPropertiesToIgnore(beanDesc.getClassInfo()),
732733
type, staticTyping, elementTypeSerializer,
733-
keySerializer, elementValueSerializer);
734+
keySerializer, elementValueSerializer, filterId);
734735
}
735736
}
736737
// [Issue#120]: Allow post-processing
@@ -948,6 +949,15 @@ protected JsonSerializer<Object> _findContentSerializer(SerializerProvider prov,
948949
return null;
949950
}
950951

952+
/**
953+
* Method called to find filter that is configured to be used with bean
954+
* serializer being built, if any.
955+
*/
956+
protected Object findFilterId(SerializationConfig config, BeanDescription beanDesc)
957+
{
958+
return config.getAnnotationIntrospector().findFilterId((Annotated)beanDesc.getClassInfo());
959+
}
960+
951961
/**
952962
* @deprecated Since 2.1: use method without 'property'
953963
*/

src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ protected JsonSerializer<Object> constructBeanSerializer(SerializerProvider prov
405405
builder.setFilterId(findFilterId(config, beanDesc));
406406

407407
AnnotatedMember anyGetter = beanDesc.findAnyGetter();
408-
if (anyGetter != null) { // since 1.6
408+
if (anyGetter != null) {
409409
if (config.canOverrideAccessModifiers()) {
410410
anyGetter.fixAccess();
411411
}
@@ -415,8 +415,9 @@ protected JsonSerializer<Object> constructBeanSerializer(SerializerProvider prov
415415
JavaType valueType = type.getContentType();
416416
TypeSerializer typeSer = createTypeSerializer(config, valueType);
417417
// last 2 nulls; don't know key, value serializers (yet)
418+
// TODO: support '@JsonIgnoreProperties' with any setter?
418419
MapSerializer mapSer = MapSerializer.construct(/* ignored props*/ null, type, staticTyping,
419-
typeSer, null, null);
420+
typeSer, null, null, /*filterId*/ null);
420421
// TODO: can we find full PropertyName?
421422
PropertyName name = new PropertyName(anyGetter.getName());
422423
BeanProperty.Std anyProp = new BeanProperty.Std(name, valueType, null,
@@ -519,15 +520,6 @@ protected PropertyBuilder constructPropertyBuilder(SerializationConfig config,
519520
protected BeanSerializerBuilder constructBeanSerializerBuilder(BeanDescription beanDesc) {
520521
return new BeanSerializerBuilder(beanDesc);
521522
}
522-
523-
/**
524-
* Method called to find filter that is configured to be used with bean
525-
* serializer being built, if any.
526-
*/
527-
protected Object findFilterId(SerializationConfig config, BeanDescription beanDesc)
528-
{
529-
return config.getAnnotationIntrospector().findFilterId((Annotated)beanDesc.getClassInfo());
530-
}
531523

532524
/*
533525
/**********************************************************

src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import com.fasterxml.jackson.core.*;
88
import com.fasterxml.jackson.databind.*;
99
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
10-
import com.fasterxml.jackson.databind.introspect.Annotated;
1110
import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
1211
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
1312
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonMapFormatVisitor;
@@ -172,13 +171,32 @@ public MapSerializer withResolved(BeanProperty property,
172171
return new MapSerializer(this, property, keySerializer, valueSerializer, ignored);
173172
}
174173

174+
/**
175+
* @since 2.3
176+
*/
175177
public MapSerializer withFilterId(Object filterId) {
176178
return (_filterId == filterId) ? this : new MapSerializer(this, filterId);
177179
}
178-
180+
181+
/**
182+
* @deprecated Since 2.3 use the method that takes `filterId`
183+
*/
184+
@Deprecated
179185
public static MapSerializer construct(String[] ignoredList, JavaType mapType,
180186
boolean staticValueType, TypeSerializer vts,
181187
JsonSerializer<Object> keySerializer, JsonSerializer<Object> valueSerializer)
188+
{
189+
return construct(ignoredList, mapType, staticValueType, vts,
190+
keySerializer, valueSerializer);
191+
}
192+
193+
/**
194+
* @since 2.3
195+
*/
196+
public static MapSerializer construct(String[] ignoredList, JavaType mapType,
197+
boolean staticValueType, TypeSerializer vts,
198+
JsonSerializer<Object> keySerializer, JsonSerializer<Object> valueSerializer,
199+
Object filterId)
182200
{
183201
HashSet<String> ignoredEntries = toSet(ignoredList);
184202
JavaType keyType, valueType;
@@ -198,8 +216,12 @@ public static MapSerializer construct(String[] ignoredList, JavaType mapType,
198216
staticValueType = false;
199217
}
200218
}
201-
return new MapSerializer(ignoredEntries, keyType, valueType, staticValueType, vts,
219+
MapSerializer ser = new MapSerializer(ignoredEntries, keyType, valueType, staticValueType, vts,
202220
keySerializer, valueSerializer);
221+
if (filterId != null) {
222+
ser = ser.withFilterId(filterId);
223+
}
224+
return ser;
203225
}
204226

205227
private static HashSet<String> toSet(String[] ignoredEntries) {

src/test/java/com/fasterxml/jackson/databind/filter/TestMapFiltering.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
public class TestMapFiltering extends BaseMapTest
1212
{
1313
@SuppressWarnings("serial")
14+
@JsonFilter("filterForMaps")
1415
static class FilteredBean extends LinkedHashMap<String,Integer> { }
1516

1617
static class MapBean {
@@ -46,7 +47,7 @@ public void testMapFilteringViaClass() throws Exception
4647
FilteredBean bean = new FilteredBean();
4748
bean.put("a", 4);
4849
bean.put("b", 3);
49-
FilterProvider prov = new SimpleFilterProvider().addFilter("filterX",
50+
FilterProvider prov = new SimpleFilterProvider().addFilter("filterForMaps",
5051
SimpleBeanPropertyFilter.filterOutAllExcept("b"));
5152
assertEquals(aposToQuotes("{'b':3}"),
5253
MAPPER.writer(prov).writeValueAsString(bean));

0 commit comments

Comments
 (0)