aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java')
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java100
1 files changed, 51 insertions, 49 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java
index 4ebd088d0..5f2ab2169 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java
@@ -5,9 +5,7 @@ import java.lang.reflect.Type;
import java.util.*;
import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonIncludeProperties;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.type.WritableTypeId;
@@ -107,7 +105,7 @@ public class MapSerializer
/* Config settings, filtering
/**********************************************************
*/
-
+
/**
* Set of entries to omit during serialization, if any
*/
@@ -115,6 +113,8 @@ public class MapSerializer
/**
* Set of entries to include during serialization, if null, it is ignored, empty will include nothing.
+ *
+ * @since 2.12
*/
protected final Set<String> _includedEntries;
@@ -145,6 +145,13 @@ public class MapSerializer
*/
protected final boolean _suppressNulls;
+ /**
+ * Helper object used for name-based filtering
+ *
+ * @since 2.12
+ */
+ protected final IgnorePropertiesUtil.Checker _inclusionChecker;
+
/*
/**********************************************************
/* Config settings, other
@@ -190,6 +197,8 @@ public class MapSerializer
_sortKeys = false;
_suppressableValue = null;
_suppressNulls = false;
+
+ _inclusionChecker = IgnorePropertiesUtil.buildCheckerIfNeeded(_ignoredEntries, _includedEntries);
}
/**
@@ -233,6 +242,8 @@ public class MapSerializer
_sortKeys = src._sortKeys;
_suppressableValue = src._suppressableValue;
_suppressNulls = src._suppressNulls;
+
+ _inclusionChecker = IgnorePropertiesUtil.buildCheckerIfNeeded(_ignoredEntries, _includedEntries);
}
/**
@@ -269,6 +280,8 @@ public class MapSerializer
_sortKeys = src._sortKeys;
_suppressableValue = suppressableValue;
_suppressNulls = suppressNulls;
+
+ _inclusionChecker = src._inclusionChecker;
}
protected MapSerializer(MapSerializer src, Object filterId, boolean sortKeys)
@@ -289,6 +302,8 @@ public class MapSerializer
_sortKeys = sortKeys;
_suppressableValue = src._suppressableValue;
_suppressNulls = src._suppressNulls;
+
+ _inclusionChecker = src._inclusionChecker;
}
@Override
@@ -391,9 +406,9 @@ public class MapSerializer
* @since 2.8
*/
public static MapSerializer construct(Set<String> ignoredEntries, JavaType mapType,
- boolean staticValueType, TypeSerializer vts,
- JsonSerializer<Object> keySerializer, JsonSerializer<Object> valueSerializer,
- Object filterId)
+ boolean staticValueType, TypeSerializer vts,
+ JsonSerializer<Object> keySerializer, JsonSerializer<Object> valueSerializer,
+ Object filterId)
{
return construct(ignoredEntries, null, mapType, staticValueType, vts, keySerializer, valueSerializer, filterId);
}
@@ -508,25 +523,19 @@ public class MapSerializer
if (_neitherNull(propertyAcc, intr)) {
final SerializationConfig config = provider.getConfig();
// ignorals
- JsonIgnoreProperties.Value ignorals = intr.findPropertyIgnoralByName(config, propertyAcc);
- if (ignorals != null){
- Set<String> newIgnored = ignorals.findIgnoredForSerialization();
- if (_nonEmpty(newIgnored)) {
- ignored = (ignored == null) ? new HashSet<String>() : new HashSet<String>(ignored);
- for (String str : newIgnored) {
- ignored.add(str);
- }
+ Set<String> newIgnored = intr.findPropertyIgnoralByName(config, propertyAcc).findIgnoredForSerialization();
+ if (_nonEmpty(newIgnored)) {
+ ignored = (ignored == null) ? new HashSet<String>() : new HashSet<String>(ignored);
+ for (String str : newIgnored) {
+ ignored.add(str);
}
}
// inclusions
- JsonIncludeProperties.Value inclusions = intr.findPropertyInclusionByName(config, propertyAcc);
- if (inclusions != null) {
- Set<String> newIncluded = inclusions.getIncluded();
- if (newIncluded != null) {
- included = (included == null) ? new HashSet<String>() : new HashSet<String>(included);
- for (String str : newIncluded) {
- included.add(str);
- }
+ Set<String> newIncluded = intr.findPropertyInclusionByName(config, propertyAcc).getIncluded();
+ if (newIncluded != null) {
+ included = (included == null) ? new HashSet<String>() : new HashSet<String>(included);
+ for (String str : newIncluded) {
+ included.add(str);
}
}
// sort key
@@ -543,13 +552,10 @@ public class MapSerializer
MapSerializer mser = withResolved(property, keySer, ser, ignored, included, sortKeys);
// [databind#307]: allow filtering
- if (property != null) {
- AnnotatedMember m = property.getMember();
- if (m != null) {
- Object filterId = intr.findFilterId(m);
- if (filterId != null) {
- mser = mser.withFilterId(filterId);
- }
+ if (propertyAcc != null) {
+ Object filterId = intr.findFilterId(propertyAcc);
+ if (filterId != null) {
+ mser = mser.withFilterId(filterId);
}
}
JsonInclude.Value inclV = findIncludeOverrides(provider, property, Map.class);
@@ -695,8 +701,6 @@ public class MapSerializer
* (which can be overridden by custom implementations), but for some
* dynamic types, it is possible that serializer is only resolved
* during actual serialization.
- *
- * @since 2.0
*/
public JsonSerializer<?> getKeySerializer() {
return _keySerializer;
@@ -776,8 +780,6 @@ public class MapSerializer
return;
}
final JsonSerializer<Object> keySerializer = _keySerializer;
- final Set<String> ignored = _ignoredEntries;
- final Set<String> included = _includedEntries;
Object keyElem = null;
try {
@@ -789,7 +791,7 @@ public class MapSerializer
provider.findNullKeySerializer(_keyType, _property).serialize(null, gen, provider);
} else {
// One twist: is entry ignorable? If so, skip
- if (IgnorePropertiesUtil.shouldIgnore(keyElem, ignored, included)) {
+ if ((_inclusionChecker != null) && _inclusionChecker.shouldIgnore(keyElem)) {
continue;
}
keySerializer.serialize(keyElem, gen, provider);
@@ -822,8 +824,6 @@ public class MapSerializer
serializeTypedFields(value, gen, provider, suppressableValue);
return;
}
- final Set<String> ignored = _ignoredEntries;
- final Set<String> included = _includedEntries;
final boolean checkEmpty = (MARKER_FOR_EMPTY == suppressableValue);
for (Map.Entry<?,?> entry : value.entrySet()) {
@@ -833,7 +833,9 @@ public class MapSerializer
if (keyElem == null) {
keySerializer = provider.findNullKeySerializer(_keyType, _property);
} else {
- if (IgnorePropertiesUtil.shouldIgnore(keyElem, ignored, included)) continue;
+ if ((_inclusionChecker != null) && _inclusionChecker.shouldIgnore(keyElem)) {
+ continue;
+ }
keySerializer = _keySerializer;
}
@@ -881,13 +883,13 @@ public class MapSerializer
throws IOException
{
final JsonSerializer<Object> keySerializer = _keySerializer;
- final Set<String> ignored = _ignoredEntries;
- final Set<String> included = _includedEntries;
final TypeSerializer typeSer = _valueTypeSerializer;
for (Map.Entry<?,?> entry : value.entrySet()) {
Object keyElem = entry.getKey();
- if (IgnorePropertiesUtil.shouldIgnore(keyElem, ignored, included)) continue;
+ if ((_inclusionChecker != null) && _inclusionChecker.shouldIgnore(keyElem)) {
+ continue;
+ }
if (keyElem == null) {
provider.findNullKeySerializer(_keyType, _property).serialize(null, gen, provider);
@@ -922,15 +924,15 @@ public class MapSerializer
Object suppressableValue) // since 2.5
throws IOException
{
- final Set<String> ignored = _ignoredEntries;
- final Set<String> included = _includedEntries;
final MapProperty prop = new MapProperty(_valueTypeSerializer, _property);
final boolean checkEmpty = (MARKER_FOR_EMPTY == suppressableValue);
for (Map.Entry<?,?> entry : value.entrySet()) {
// First, serialize key; unless ignorable by key
final Object keyElem = entry.getKey();
- if (IgnorePropertiesUtil.shouldIgnore(keyElem, ignored, included)) continue;
+ if ((_inclusionChecker != null) && _inclusionChecker.shouldIgnore(keyElem)) {
+ continue;
+ }
JsonSerializer<Object> keySerializer;
if (keyElem == null) {
@@ -981,8 +983,6 @@ public class MapSerializer
Object suppressableValue) // since 2.5
throws IOException
{
- final Set<String> ignored = _ignoredEntries;
- final Set<String> included = _includedEntries;
final boolean checkEmpty = (MARKER_FOR_EMPTY == suppressableValue);
for (Map.Entry<?,?> entry : value.entrySet()) {
@@ -992,7 +992,9 @@ public class MapSerializer
keySerializer = provider.findNullKeySerializer(_keyType, _property);
} else {
// One twist: is entry ignorable? If so, skip
- if (IgnorePropertiesUtil.shouldIgnore(keyElem, ignored, included)) continue;
+ if ((_inclusionChecker != null) && _inclusionChecker.shouldIgnore(keyElem)) {
+ continue;
+ }
keySerializer = _keySerializer;
}
final Object valueElem = entry.getValue();
@@ -1042,15 +1044,15 @@ public class MapSerializer
Object suppressableValue)
throws IOException
{
- final Set<String> ignored = _ignoredEntries;
- final Set<String> included = _includedEntries;
final MapProperty prop = new MapProperty(_valueTypeSerializer, _property);
final boolean checkEmpty = (MARKER_FOR_EMPTY == suppressableValue);
for (Map.Entry<?,?> entry : value.entrySet()) {
// First, serialize key; unless ignorable by key
final Object keyElem = entry.getKey();
- if (IgnorePropertiesUtil.shouldIgnore(keyElem, ignored, included)) continue;
+ if ((_inclusionChecker != null) && _inclusionChecker.shouldIgnore(keyElem)) {
+ continue;
+ }
JsonSerializer<Object> keySerializer;
if (keyElem == null) {