Jackson enum财产未获得认可

时间:2015-11-24 09:44:41

标签: java jackson

我有一个这样的枚举:

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

2 个答案:

答案 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();
    }
}