使用name()和value序列化枚举

rqqzpn5f  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(265)

我有一个简单的(groovy)枚举:

enum OutputType { 
  skip( 'gray' ), left( 'orange' ), right( 'cyan' )

  final String color

  private OutputType( String color ) {
    this.color = color
  }  
}

我想用jackson序列化它,使它看起来像(伪json):

{ skip:gray, left:orange, right:cyan }

或者换言之 name()color 对象。
如何做到这一点与平原Jackson?

sigwle7e

sigwle7e1#

假设枚举如下所示:

public enum OutputType {

    SKIP("gray"),
    LEFT("orange"),
    RIGHT("cyan");

    private final String color;
    public String getColor() { return color; }

    OutputType(String color) {
    this.color = color;
    }

}

你需要延长Jackson的手术时间 JsonSerializer 像这样创建自己的实现:

public class OutputTypeSerializer extends JsonSerializer<OutputType> {

    @Override
    public void serialize(OutputType value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    if (null == value) {
        gen.writeNull();
    } else {
        gen.writeString(value.getColor());
    }
    }

}

那么假设你有 dto 带着一个 OutputType 字段唯一需要做的就是添加正确的注解,如下所示:

public class OutputDto {

    @JsonSerialize(using = OutputTypeSerializer.class)
    private OutputType type;
    public OutputType getType() { return type; }
    public void setType(OutputType type) { this.type = type; }

}

相反,您可以实现 JsonDeserializer 是否需要重新创建 OutputType 从给定的 JSON 资源。

相关问题