我有一个这样的枚举:
public enum Type {
@JsonProperty("private")Private, group, supergroup, channel
}
json文件本身有私有字段所以我需要私有(这是java键盘)进行序列化和映射但是如果我使用 private ,那么所有小写都是运行时错误。我使用@JsonProperty作为上面的代码,但仍然不起作用。
你对此有什么解决方案吗?
这是例外:
com.fasterxml.jackson.databind.exc.InvalidFormatException:不能 从字符串值构造com.mehdi.model.Chat $ Type的实例 'private':值不是声明的Enum实例名称之一:[Private, group,supergroup,channel] at [来源:/home/mehdi/Desktop/json.txt; line:14,column:16](通过参考链: com.mehdi.model.Update [ “消息”] - > com.mehdi.model.Message [ “聊天”] - GT; com.mehdi.model.Chat [ “型”]) 在 com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:55) 在 com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:742) 在 com.fasterxml.jackson.databind.deser.std.EnumDeserializer.deserialize(EnumDeserializer.java:91) 在 com.fasterxml.jackson.databind.deser.std.EnumDeserializer.deserialize(EnumDeserializer.java:20) 在 com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:525) 在 com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:99) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:242) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118) 在 com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:525) 在 com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:99) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:242) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118) 在 com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:525) 在 com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:99) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:242) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2052) 在com.mehdi.ff.Test.main(Test.java:25)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:497)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
处理完成,退出代码为0
答案 0 :(得分:5)
你必须在枚举实现中使用 @JsonValue 。
public enum Type {
Private("private"),
Group("group"),
Supergroup("supergroup"),
Channel("channel")
private String jsonValue;
private Type(final String json) {
this.jsonValue = json;
}
@JsonValue
public String jsonValue() {
return this.jsonValue;
}
}
答案 1 :(得分:0)
由于@Toilal的暗示,我提出了这个解决方案:
public enum Type {
Private, group, supergroup, channel;
@JsonValue
public String toString() {
return super.toString().toLowerCase();
}
}