diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2016-10-16 23:07:32 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2016-10-16 23:07:32 -0700 |
commit | ed3f4a90600b4cf9580ad3c5be9a92ec059642bc (patch) | |
tree | 726a759f6c2fa0fc38cba2515d03cc270129a269 /src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java | |
parent | b6d330f860c62da8ba53ec0685eea42868fa27bd (diff) | |
parent | 6362e24be428cff2e1b0185887083e4b3cf26908 (diff) | |
download | jackson-databind-ed3f4a90600b4cf9580ad3c5be9a92ec059642bc.tar.gz |
Merge branch '2.8'
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.java | 59 |
1 files changed, 53 insertions, 6 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 3a98c3c4f..17a9e37ef 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 @@ -634,7 +634,7 @@ public class MapSerializer gen.writeStartObject(value); if (!value.isEmpty()) { if (_sortKeys || provider.isEnabled(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS)) { - value = _orderEntries(value); + value = _orderEntries(value, gen, provider); } if (_filterId != null) { serializeFilteredFields(value, gen, provider, @@ -660,7 +660,7 @@ public class MapSerializer gen.setCurrentValue(value); if (!value.isEmpty()) { if (_sortKeys || provider.isEnabled(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS)) { - value = _orderEntries(value); + value = _orderEntries(value, gen, provider); } if (_filterId != null) { serializeFilteredFields(value, gen, provider, @@ -1050,7 +1050,8 @@ public class MapSerializer return result.serializer; } - protected Map<?,?> _orderEntries(Map<?,?> input) + protected Map<?,?> _orderEntries(Map<?,?> input, JsonGenerator gen, + SerializerProvider provider) throws IOException { // minor optimization: may already be sorted? if (input instanceof SortedMap<?,?>) { @@ -1061,12 +1062,58 @@ public class MapSerializer TreeMap<Object,Object> result = new TreeMap<Object,Object>(); for (Map.Entry<?,?> entry : input.entrySet()) { Object key = entry.getKey(); - if (key != null) { - result.put(key, entry.getValue()); - } + if (key == null) { + _writeNullKeyedEntry(gen, provider, entry.getValue()); + continue; + } + result.put(key, entry.getValue()); } return result; } return new TreeMap<Object,Object>(input); } + + protected void _writeNullKeyedEntry(JsonGenerator gen, SerializerProvider provider, + Object value) throws IOException + { + JsonSerializer<Object> keySerializer = provider.findNullKeySerializer(_keyType, _property); + JsonSerializer<Object> valueSer; + if (value == null) { + if (_suppressNulls) { + return; + } + valueSer = provider.getDefaultNullValueSerializer(); + } else { + valueSer = _valueSerializer; + if (valueSer == null) { + Class<?> cc = value.getClass(); + valueSer = _dynamicValueSerializers.serializerFor(cc); + if (valueSer == null) { + if (_valueType.hasGenericTypes()) { + valueSer = _findAndAddDynamic(_dynamicValueSerializers, + provider.constructSpecializedType(_valueType, cc), provider); + } else { + valueSer = _findAndAddDynamic(_dynamicValueSerializers, cc, provider); + } + } + } + if (_suppressableValue == MARKER_FOR_EMPTY) { + if (valueSer.isEmpty(provider, value)) { + return; + } + } else if (_suppressableValue != null) { + if (_suppressableValue.equals(value)) { + return; + } + } + } + + try { + keySerializer.serialize(null, gen, provider); + valueSer.serialize(value, gen, provider); + } catch (Exception e) { + String keyDesc = ""; + wrapAndThrow(provider, e, value, keyDesc); + } + } } |