How To Serialize Enums as JSON Objects with Jackson

在使用枚举的时候,默认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}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值