Skip to content
This repository has been archived by the owner on Jan 22, 2019. It is now read-only.

Commit

Permalink
Fix #61 for 2.3[.6]
Browse files Browse the repository at this point in the history
  • Loading branch information
cowtowncoder committed Jan 23, 2015
1 parent 155f55f commit 0b31437
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 17 deletions.
5 changes: 5 additions & 0 deletions release-notes/VERSION
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ Project: jackson-datatype-guava
=== History: ===
------------------------------------------------------------------------

2.3.6 (not yet released)

#61: NPE when serializing `Multimap`s with null values
(reported by sixinli@github)

2.3.5 (14-Jan-2015)

#46: Can not serialize Guava `Iterable`s (backported from 2.4.2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,53 +124,57 @@ public boolean hasSingleElement(Multimap<?,?> map) {
public boolean isEmpty(Multimap<?,?> map) {
return map.isEmpty();
}

/*
/**********************************************************
/* Post-processing (contextualization)
/**********************************************************
*/

@Override
public void serialize(Multimap<?, ?> value, JsonGenerator jgen, SerializerProvider provider)
public void serialize(Multimap<?, ?> value, JsonGenerator gen, SerializerProvider provider)
throws IOException, JsonProcessingException
{
jgen.writeStartObject();
gen.writeStartObject();
if (!value.isEmpty()) {
serializeFields(value, jgen, provider);
serializeFields(value, gen, provider);
}
jgen.writeEndObject();
gen.writeEndObject();
}

@Override
public void serializeWithType(Multimap<?,?> value, JsonGenerator jgen, SerializerProvider provider,
public void serializeWithType(Multimap<?,?> value, JsonGenerator gen, SerializerProvider provider,
TypeSerializer typeSer)
throws IOException, JsonGenerationException
{
typeSer.writeTypePrefixForObject(value, jgen);
serializeFields(value, jgen, provider);
typeSer.writeTypeSuffixForObject(value, jgen);
typeSer.writeTypePrefixForObject(value, gen);
serializeFields(value, gen, provider);
typeSer.writeTypeSuffixForObject(value, gen);
}

private final void serializeFields(Multimap<?, ?> value, JsonGenerator jgen, SerializerProvider provider)
private final void serializeFields(Multimap<?, ?> value, JsonGenerator gen, SerializerProvider provider)
throws IOException, JsonProcessingException
{
for (Entry<?, ? extends Collection<?>> e : value.asMap().entrySet()) {
if (_keySerializer != null) {
_keySerializer.serialize(e.getKey(), jgen, provider);
_keySerializer.serialize(e.getKey(), gen, provider);
} else {
provider.findKeySerializer(provider.constructType(String.class), _property)
.serialize(e.getKey(), jgen, provider);
.serialize(e.getKey(), gen, provider);
}
if (_valueSerializer != null) {
// note: value is a List, but generic type is for contents... so:
jgen.writeStartArray();
gen.writeStartArray();
for (Object vv : e.getValue()) {
_valueSerializer.serialize(vv, jgen, provider);
if (vv == null) {
provider.defaultSerializeNull(gen);
} else {
_valueSerializer.serialize(vv, gen, provider);
}
}
jgen.writeEndArray();
gen.writeEndArray();
} else {
provider.defaultSerializeValue(Lists.newArrayList(e.getValue()), jgen);
provider.defaultSerializeValue(Lists.newArrayList(e.getValue()), gen);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,15 @@ public void testEmptyMapExclusion() throws Exception
String json = MAPPER.writeValueAsString(new MultiMapWrapper());
assertEquals("{}", json);
}


public void testNullHandling() throws Exception
{
Multimap<String,Integer> input = ArrayListMultimap.create();
input.put("empty", null);
String json = MAPPER.writeValueAsString(input);
assertEquals("{\"empty\":[null]}", json);
}

/*
/**********************************************************************
/* Unit tests for set-based multimaps
Expand Down

0 comments on commit 0b31437

Please sign in to comment.