在使用枚举的时候,默认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
}
- Default Enum Representation
使用
new ObjectMapper().writeValueAsString(Distance.MILE);
输出
{"unit":"miles","meters":1609.34}
这种是默认是的方式,但是往往在开发中,并不需要这样的输出。
- Enum as Json Object
使用
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Distance { ... }
输出
{"unit":"miles","meters":1609.34}
这种情况下,枚举将会以对象的方式进行序列化。
- Enums and @JsonValue
使用
public enum Distance {
...
@JsonValue
public String getMeters() {
return meters;
}
}
输出
1609.34
这种往往是我们需要的,在需要实际输出的get方法上加上注解
@JsonValue
- 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}
更多的详细信息