【问题标题】:Jackson - Serialize / Deserialize Enums with Integer fieldsJackson - 使用整数字段序列化/反序列化枚举
【发布时间】:2018-07-31 18:12:17
【问题描述】:

这里有一个非常相似的问题 - Jackson: Serialize and deserialize enum values as integers 处理使用 Jackson 序列化和反序列化枚举,其解决方案非常简单,使用 @JsonValue 注释。

如果我们有一个带有如下整数字段的枚举,这将不起作用。

enum State{
    GOOD(1), BAD(-1), UGLY(0);

    int id;

    State(int id) {
        this.id = id;
    }
}

如果我们的要求是序列化并提供实际值而不是name()。比如说,{"name":"foo","state":1} 之类的东西代表 GOOD for foo。添加@JsonValue 注释仅在序列化和反序列化失败的情况下才有帮助。如果我们没有字段,这意味着 GOOD=0、BAD=1、UGLY=2、@JsonValue 就足够了,并且当字段存在时,Jackson 无法反序列化 - 0 和 1 映射错误,-1 出现异常。

【问题讨论】:

    标签: java json enums jackson


    【解决方案1】:

    这可以使用 Jackson 注释 @JsonCreator 来实现。对于序列化,带有@JsonValue 的方法可以返回一个int,对于反序列化,带有@JsonCreatorstatic 方法可以接受一个int in 参数,如下所示。

    以下代码供参考:

    enum State{
        GOOD(1), BAD(-1), UGLY(0);
    
        int id;
    
        State(int id) {
            this.id = id;
        }
    
        @JsonValue
        int getId() {
            return id;
        }
    
        @JsonCreator
        static State fromId(int id){
            return Stream.of(State.values()).filter(state -> state.id == id).findFirst().get();
        }
    
    }
    

    注意:这目前是 Jackson 库上的一个开放错误 - https://github.com/FasterXML/jackson-databind/issues/1850

    【讨论】:

      【解决方案2】:

      我在使用其他解决方案时遇到了问题。这对我有用(杰克逊 2.9.9):

      @JsonFormat(shape = JsonFormat.Shape.OBJECT)
      enum State{
          GOOD(1), BAD(-1), UGLY(0);
      
          int id;
      
          State(int id) {
              this.id = id;
          }
      
          @JsonValue
          int getId() { return id; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-19
        • 2016-10-16
        • 1970-01-01
        • 2014-08-10
        • 2021-12-27
        • 2011-12-07
        • 2014-07-16
        相关资源
        最近更新 更多