【问题标题】:Jackson: enum instance methods to return values as stringsJackson:枚举实例方法以将值作为字符串返回
【发布时间】:2014-11-20 20:59:07
【问题描述】:

请注意:虽然这个问题似乎类似于this one,但我提出的问题略有不同。

我正在通过Jackson 将 POJO 序列化/反序列化为 JSON。

我正在尝试让我的 UserStatus 枚举实例很好地(反)序列化并尝试通过:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
enum UserStatus {
    Unregistered,
    Activated,
    Deactivated,
    Locked

    @JsonValue
    String toValue() {
        // TODO: ???
    }
}

如果我对Jackson的理解是正确的,那么我的toValue()方法只需要弄清楚当前UserStatus实例是什么值,并将其转换为String即可。所以UserStatus.Activated.toValue() 应该给我们一个值为"Activated" 的字符串。

主要问题:我如何做到这一点?

辅助问题:这是在杰克逊地区序列化/反序列化枚举的正确方法吗?

【问题讨论】:

    标签: java serialization enums jackson


    【解决方案1】:

    只需调用 name() 方法。见下例:

    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonValue;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    
    ;
    
    public class JacksonTest {
    
        public static void main(String[] args) throws Exception {
            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
            mapper.configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, true);
    
            Pojo pojo = new Pojo();
            pojo.userStatus = UserStatus.Activated;
            String json = mapper.writeValueAsString(pojo);
            System.out.println(json);
            Pojo deserializedPojo = mapper.readValue(json, Pojo.class);
            System.out.println("--");
            System.out.println(deserializedPojo);
        }
    
        public static class Pojo {
            public UserStatus userStatus;
    
            @Override
            public String toString() {
                return userStatus.name();
            }
        }
    
        @JsonIgnoreProperties(ignoreUnknown = true)
        @JsonInclude(JsonInclude.Include.NON_NULL)
        public enum UserStatus {
            Unregistered, Activated, Deactivated, Locked;
    
            @JsonValue
            public String toValue() {
                return name();
            }
        }
    }
    

    上面的程序打印:

    {
      "userStatus" : "Activated"
    }
    --
    Activated
    

    【讨论】:

      【解决方案2】:

      从 Jackson 2.1.2 开始,您可以使用 @JsonFormat 注释来控制 Enum 实例如何序列化为 JSON 字符串。

      @JsonFormat(shape = JsonFormat.Shape.OBJECT)
      public enum Type { ... }
      

      http://www.baeldung.com/jackson-serialize-enums

      【讨论】:

        猜你喜欢
        • 2018-12-26
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        • 2018-11-24
        • 1970-01-01
        相关资源
        最近更新 更多