Skip to content

Commit

Permalink
Fix a regression bug wrt serialization of enums (triggered a fail on …
Browse files Browse the repository at this point in the history
…JSON-schema module)
  • Loading branch information
cowtowncoder committed Apr 21, 2015
1 parent ee6a3ca commit 6b2fbba
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 8 deletions.
Expand Up @@ -172,16 +172,19 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
}
return;
}
boolean usingToString = (serializers != null) &&
serializers.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);

JsonStringFormatVisitor stringVisitor = visitor.expectStringFormat(typeHint);
if (typeHint != null && stringVisitor != null) {
if (stringVisitor != null) {
Set<String> enums = new LinkedHashSet<String>();
for (SerializableString value : _values.values()) {
if (usingToString) {
enums.add(value.toString());
} else {

// Use toString()?
if ((serializers != null) &&
serializers.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING)) {
for (Enum<?> e : _values.enums()) {
enums.add(e.toString());
}
} else {
// No, serialize using name() or explicit overrides
for (SerializableString value : _values.values()) {
enums.add(value.getValue());
}
}
Expand Down
Expand Up @@ -75,6 +75,15 @@ public Collection<SerializableString> values() {
return Arrays.asList(_textual);
}

/**
* Convenience accessor for getting raw Enum instances.
*
* @since 2.6
*/
public List<Enum<?>> enums() {
return Arrays.asList(_values);
}

/**
* Method used for serialization and introspection by core Jackson code.
*/
Expand Down
@@ -0,0 +1,54 @@
package com.fasterxml.jackson.databind.jsonschema;

import java.util.*;

import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonStringFormatVisitor;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat;

/**
* Basic tests to exercise low-level support added for JSON Schema module and
* other modules that use type introspection.
*/
public class NewSchemaTest extends BaseMapTest
{
enum TestEnum {
A, B, C;

@Override
public String toString() {
return "ToString:"+name();
}
}

private final ObjectMapper MAPPER = new ObjectMapper();

public void testSimpleEnum() throws Exception
{
final Set<String> values = new TreeSet<String>();
ObjectWriter w = MAPPER.writer(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);

w.acceptJsonFormatVisitor(TestEnum.class, new JsonFormatVisitorWrapper.Base() {
@Override
public JsonStringFormatVisitor expectStringFormat(JavaType type) {
return new JsonStringFormatVisitor() {
public void enumTypes(Set<String> enums) {
values.addAll(enums);
}

@Override
public void format(JsonValueFormat format) { }
};
}
});

assertEquals(3, values.size());
TreeSet<String> exp = new TreeSet<String>(Arrays.asList(
"ToString:A",
"ToString:B",
"ToString:C"
));
assertEquals(exp, values);
}
}

0 comments on commit 6b2fbba

Please sign in to comment.