【问题标题】:Serializing enum with name() and value使用 name() 和 value 序列化枚举
【发布时间】:2020-12-08 16:27:16
【问题描述】:

我有一个简单的 (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 实现这一目标?

【问题讨论】:

  • 您必须自己写JsonSerializer 才能做到这一点。
  • @SotiriosDelimanolis 现在我做OutputType.values().collectEntries{ [ it.name(), it.color ] }
  • @injecteer,将其转换为Map 并将其序列化为原始对象可能是最简单(最好)的选择。 JsonSerializer 用于将实例而不是整个enum 序列化为JSON Obect

标签: java groovy enums jackson


【解决方案1】:

假设您的枚举如下所示:

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; }
    
}

相反,如果您需要从给定的JSON 资源重新创建OutputType 对象,则可以实现JsonDeserializer

【讨论】:

  • 这会产生类似{"type":"gray"}的东西。
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 2013-05-20
  • 1970-01-01
  • 2015-10-19
  • 2015-11-15
  • 1970-01-01
  • 2012-05-22
相关资源
最近更新 更多