实际答案:
枚举默认的反序列化程序使用 .name()
来反序列化,因此它没有使用 @JsonValue
。所以正如@OldCurmudgeon指出的那样,您需要传入 {"event": "FORGOT_PASSWORD"}
以匹配 .name()
值。
另一个选项(假设您希望写入和读取的JSON值相同)...
更多信息:
Jackson 还有一种管理序列化和反序列化过程的方法。您可以指定这些注释来使用自己的自定义序列化程序和反序列化程序:
@JsonSerialize(using = MySerializer.class)
@JsonDeserialize(using = MyDeserializer.class)
public final class MyClass {
...
}
那么你需要编写类似下面这样的 MySerializer
和 MyDeserializer
:
MySerializer
public final class MySerializer extends JsonSerializer<MyClass>
{
@Override
public void serialize(final MyClass yourClassHere, final JsonGenerator gen, final SerializerProvider serializer) throws IOException, JsonProcessingException
{
}
}
MyDeserializer
public final class MyDeserializer extends org.codehaus.jackson.map.JsonDeserializer<MyClass>
{
@Override
public MyClass deserialize(final JsonParser parser, final DeserializationContext context) throws IOException, JsonProcessingException
{
return null;
}
}
最后一点,特别是对于将此操作应用于序列化方法为getYourValue()
的枚举JsonEnum
的情况,您的序列化程序和反序列化程序可能如下所示:
public void serialize(final JsonEnum enumValue, final JsonGenerator gen, final SerializerProvider serializer) throws IOException, JsonProcessingException
{
gen.writeString(enumValue.getYourValue());
}
public JsonEnum deserialize(final JsonParser parser, final DeserializationContext context) throws IOException, JsonProcessingException
{
final String jsonValue = parser.getText();
for (final JsonEnum enumValue : JsonEnum.values())
{
if (enumValue.getYourValue().equals(jsonValue))
{
return enumValue;
}
}
return null;
}
{"Event":"FORGOT_PASSWORD"}
吗?注意 Event 和 FORGOT_PASSWORD 都是大写。 - OldCurmudgeongetValue
,这个GetValue
是不起作用的。 - Davut Gürbüz