美文网首页
jackson 枚举 enum json 解析类型 返回数字 或

jackson 枚举 enum json 解析类型 返回数字 或

作者: LoWang | 来源:发表于2017-02-09 13:50 被阅读0次

    在使用枚举的时候,默认system.out.printlin(USERACTION.LOGIN);输出的将会LOGIN,也就是枚举的变量名。当然如果是调用toString方法,可以进行重写返回自定义的字段。

    jackson中,序列化枚举的时候,默认返回的是枚举的name,也就是变量名。当然我们想要返回枚举里面的某个值时,可以有以下几个操作。

    枚举类:

    public enum Distance {
        KILOMETER("km", 1000), 
        MILE("miles", 1609.34),
        METER("meters", 1), 
        INCH("inches", 0.0254),
        CENTIMETER("cm", 0.01), 
        MILLIMETER("mm", 0.001);
     
        private String unit;
        private final double meters;
     
        private Distance(String unit, double meters) {
            this.unit = unit;
            this.meters = meters;
        }
     
        // standard getters and setters
    }
    
    1. Default Enum Representation

    使用

    new ObjectMapper().writeValueAsString(Distance.MILE);
    

    输出

    {"unit":"miles","meters":1609.34}
    

    这种是默认是的方式,但是往往在开发中,并不需要这样的输出。

    1. Enum as Json Object

    使用

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

    输出

    {"unit":"miles","meters":1609.34}
    

    这种情况下,枚举将会以对象的方式进行序列化。

    1. Enums and @JsonValue

    使用

    public enum Distance { 
        ...
      
        @JsonValue
        public String getMeters() {
            return meters;
        }
    }
    

    输出

    1609.34
    

    这种往往是我们需要的,在需要实际输出的get方法上加上注解@JsonValue

    1. Custom Serializer for Enum
    public class DistanceSerializer extends StdSerializer {
         
        public DistanceSerializer() {
            super(Distance.class);
        }
     
        public DistanceSerializer(Class t) {
            super(t);
        }
     
        public void serialize(Distance distance, JsonGenerator generator,
          SerializerProvider provider) 
          throws IOException, JsonProcessingException {
            generator.writeStartObject();
            generator.writeFieldName("name");
            generator.writeNumber(distance.name());
            generator.writeFieldName("unit");
            generator.writeString(distance.getUnit());
            generator.writeFieldName("meters");
            generator.writeNumber(distance.getMeters());
            generator.writeEndObject();
        }
    }
    
    @JsonSerialize(using = DistanceSerializer.class)
    public enum TypeEnum { ... }
    
    {"name":MILE,"unit":"miles","meters":1609.34}
    

    更多的详细信息

    相关文章

      网友评论

          本文标题:jackson 枚举 enum json 解析类型 返回数字 或

          本文链接:https://www.haomeiwen.com/subject/axbiittx.html