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...
#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;
}
```
