如何配置杰克逊以将Enum转换为JSON?

时间:2019-05-05 09:43:18

标签: java spring-boot enums jackson jackson-databind

@AllArgsConstructor
@Getter    
public enum MemberType {
    INTERN("name_intern", 1),
    EMPLOYEE("name_employee", 10);

    private String name;
    private int workingMonth;
}

这是我的枚举。我想将Enum类转换为带有某些约束的JSON字符串。

  1. 我希望MemberType与Jackson无关
  2. 我想将MemberType.INTERN转换为{id:INTERN, name:"name_intern", workingMonth:10}
  3. 我有很多枚举要像上面那样转换。他们的财产数量互不相同。
  4. 我只想通过一个全局配置解决此问题。
  5. 我不想使用显式的Java反射。

是否有符合上述约束的解决方案?

2 个答案:

答案 0 :(得分:1)

您可以像这样使用@JsonFormat注释:

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

或者您可以像这样使用@JsonValue注释:

public enum MemberType {
        [...]

@JsonValue
public String getName() {
 return name;
}

}

或者也许是CustomSerializer的Enum,您可以找到更多详细信息here

答案 1 :(得分:0)

如果实现JsonSerializer,则可以自定义序列化。

下面显示一个示例。

@JsonComponent
public final class MediaTypeJsonComponent {
    public static class Serializer extends JsonSerializer<MemberType> {
        @Override
        public void serialize(MemberType value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStartObject();
            gen.writeStringField("id", value.name());
            gen.writeNumberField("workingMonth", value.getWorkingMonth());
            gen.writeStringField("name", value.getName());
            gen.writeEndObject();
        }
    }
    //
    // If you need,write code.
    //public static class Deserializer extends JsonDeserializer<Customer> {
    //}
}

另一种方法是实现JsonSerialize。

如果需要更多信息,请参考: