Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Post History
One solution is to create a method in the enum that takes a String and converts it to the correspondent value. Then we annotate this method with @JsonCreator: import com.fasterxml.jackson.annotati...
Answer
#1: Initial revision
One solution is to create a method in the `enum` that takes a `String` and converts it to the correspondent value. Then we annotate this method with [`@JsonCreator`](https://javadoc.io/static/com.fasterxml.jackson.core/jackson-annotations/2.17.2/com/fasterxml/jackson/annotation/JsonCreator.html): ```java import com.fasterxml.jackson.annotation.JsonCreator; enum Bar { X, Y; @JsonCreator public static Bar fromString(String value) { return Bar.valueOf(value); } } ``` Now only valid strings are accepted. In this case, `{"bar": "X"}` and `{"bar": "Y"}`. Any other value (such as `{"bar": "A"}` or `{"bar": 1}`) will raise an exception. --- Another solution is to create your own deserializer: ```java import com.fasterxml.jackson.core.JacksonException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonMappingException; import java.io.IOException; public class BarDeserializer extends JsonDeserializer<Bar> { @Override public Bar deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JacksonException { JsonToken jsonToken = jp.getCurrentToken(); if (jsonToken == JsonToken.VALUE_STRING) { // value is a string try { return Bar.valueOf(jp.getValueAsString()); } catch (IllegalArgumentException | NullPointerException e) { throw new JsonMappingException(jp, "Invalid value for enum Bar", e); } } // value is not a string throw new JsonMappingException(jp, "Value must be a string"); } } ``` Then you annotate the `enum` with it: ```java import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @JsonDeserialize(using = BarDeserializer.class) enum Bar { X, Y; } ```