【问题标题】:Jackson enum property does not get recognized杰克逊枚举属性没有得到认可
【发布时间】:2016-02-26 16:32:21
【问题描述】:

我有一个像这样的枚举:

public enum Type {
   @JsonProperty("private")Private, group, supergroup, channel    
}

json 文件本身具有私有字段,因此我需要私有(即 java 键盘)用于序列化和映射,但如果我使用 private 和所有小写字母,则会出现运行时错误。我使用@JsonProperty 作为上面的代码,但仍然无法正常工作。

你有什么解决办法吗?

这里是个例外:

com.fasterxml.jackson.databind.exc.InvalidFormatException: 不能 从字符串值构造 com.mehdi.model.Chat$Type 的实例 “私有”:值不是声明的枚举实例名称之一:[私有, [来源:/home/mehdi/Desktop/json.txt;组、超级组、频道] 行:14,列:16](通过参考链: com.mehdi.model.Update["message"]->com.mehdi.model.Message["chat"]->com.mehdi.model.Chat["type"]) 在 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) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

进程以退出代码 0 结束

【问题讨论】:

  • 请详细说明“...但仍然无法正常工作”。它有什么作用?它不做什么?
  • @nop77svk 我已经提出了例外~

标签: java jackson


【解决方案1】:

您必须在枚举实现中使用 @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;
    }

}

【讨论】:

    【解决方案2】:

    由于@Toilal 的提示,我想出了这个解决方案:

    public enum Type {
        Private, group, supergroup, channel;
        @JsonValue
        public String toString() {
            return super.toString().toLowerCase();
        }
    }
    

    【讨论】:

    • 这两个注解在这个实现中都没有用。
    • toString() 在@JsonValue 不存在时使用。
    • @Toilal 当一个枚举想要获取字符串时,它会调用 toString 方法并且默认的 toString 方法只是返回精确的枚举字母,这个技巧将从超类中获取枚举的值: “私有”,小写它“私有”,用于解决问题,子枚举覆盖方法要求获取小写值,最后通过杰克逊作为 json 绑定的 JsonValue ~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2015-05-23
    • 2017-09-03
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多