Reputation: 11946
I am trying to deserialize JSON into a Java POJO using Jackson. Without giving away confidential information, here is an example stack trace when ObjectMapper's deserialization fails:
org.codehaus.jackson.map.JsonMappingException: Can not construct Map key of type com.example.MyEnum from String "coins": not a valid representation: Can not construct Map key of type com.example.MyEnum from String "coins": not one of values for Enum class
My JSON looks like this:
"foo": {
"coins": null,
...
}
And the class I want to deserialize into has this field:
private Map<MyEnum, MyPojo> foo;
And my enum type looks like this:
public enum MyEnum {
COINS("coins"),
...
}
I do realize that I am trying to deserialize a null value. But I believe this should still work: the result of the deserialization should be equivalent to having a Map with foo.put(MyEnum.COINS, null)
, which is indeed a valid Java instruction. Help is much appreciated, thanks in advance.
Upvotes: 15
Views: 19391
Reputation: 116610
In addition to one good solution presented (factory method), there are 2 other ways:
MyEnum.toString()
would return coins
, you can make Jackson use toString()
over name()
with ObjectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
@JsonValue
annotation (you can actually use that on toString()
as well, instead of enabling the above feature) -- if that annotation exists, the value returned by that method is used as the id.Upvotes: 14
Reputation: 10161
Provide a static factory method in your enumeration class that constructs enum by string and annotate it with @JsonCreator:
@JsonCreator
public static MyEnum fromValue(String v) {
for (MyEnum myEnum : values()) {
if (myEnum.text.equals(v)) {
return myEnum;
}
}
throw new IllegalArgumentException("invalid string value passed: " + v);
}
Upvotes: 7
Reputation: 11946
GRR! Figured it out.
Solution for me was to create a static method, annotated with @JsonCreator
, in my enum that creates an instance of the enum, based on a String parameter. It looked like this:
@JsonCreator
public static MyEnum create(String str) {
// code to return an enum based on the String parameter
}
Upvotes: 11