更新时间:2022-03-30 22:15:58
我认为你应该定义外部 deserializer 用于 Grade
枚举.
I think you should define external deserializer for Grade
enum.
我向枚举添加了额外的字段 - 未知:
I added additional field to enum - UNKNOWN:
enum Grade {
A, B, C, UNKNOWN;
public static Grade fromString(String value) {
for (Grade grade : values()) {
if (grade.name().equalsIgnoreCase(value)) {
return grade;
}
}
return UNKNOWN;
}
}
class Employee {
@JsonDeserialize(using = GradeDeserializer.class)
private Grade grade;
private String name;
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Employee [grade=" + grade + ", name=" + name + "]";
}
}
现在,解析器看起来像这样:
Now, parser could look like that:
class GradeDeserializer extends JsonDeserializer<Grade> {
@Override
public Grade deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
return Grade.fromString(parser.getValueAsString());
}
}
示例用法:
public class JacksonProgram {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
JsonFactory jsonFactory = new JsonFactory();
JsonParser parser = jsonFactory
.createJsonParser("{"name":"John", "grade":"D"}");
Employee employee = objectMapper.readValue(parser, Employee.class);
System.out.println(employee);
}
}
输出:
Employee [grade=UNKNOWN, name=John]
如果你不想添加额外的字段,你可以返回 null
例如.
If you don't want to add additional field, you would return null
for example.