Java 您不拥有的Jackson枚举格式

Java 您不拥有的Jackson枚举格式,java,jackson-databind,Java,Jackson Databind,我无法找到在POJO中序列化/反序列化枚举的方法。我找到的大多数答案只涉及可以更改的枚举。我无法更改枚举 这是我的POJO的一个例子 import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import javax.validation.constraints.NotNull; import lombok.Data; impo

我无法找到在POJO中序列化/反序列化枚举的方法。我找到的大多数答案只涉及可以更改的枚举。我无法更改枚举

这是我的POJO的一个例子

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import javax.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;

@Data
@NoArgsConstructor
@JsonInclude(Include.NON_NULL)
public class TitleRatingCheckItemResponse {
  private String titleId;

  @NotNull private Status status;

  @NoArgsConstructor
  @Data
  public static class Status {

    @NotNull
    private HttpStatus code;
  }
}
当我将对象序列化为JSON时,我得到了一个示例

{
  "status": {
     "code": "OK"
  },
  "titleId": "titl_doc-1"
}
我想要的是一个JSON结构,如下所示

{
  "status": {
     "code": "200"
  },
  "titleId": "titl_doc-1"
}
为了获得所需的JSON输出,我必须更改HttpStatus。这显然是不可能的,因为我没有HttpStatus的源代码。我有办法做到吗

创建一个类

public class HttpStatusSerializer extends StdSerializer<HttpStatus> {
    public HttpStatusSerializer() {
        super(HttpStatus.class);
    }

    @Override
    public void serialize(HttpStatus value, JsonGenerator gen, SerializerProvider serializers) { 
        gen.writeString(String.valueOf(value.code())); // or whatever you want
    }
}
或者,如果您只想将自定义序列化程序用于此字段而不是所有HttpStatus,请执行以下操作:


他们不也需要一个反序列化器吗?@AlexeyRomanov谢谢你的回答。我认为一定有一种方法可以做到这一点,而不必提供自定义序列化程序和反序列化程序。至少它可以与您提供的解决方案配合使用。对于单个字段,您也可以使用转换器,这会更简单。我看不到在ObjectMapper上注册它的方法。对于这个用例,其他一些JSON库可能更简单。@AlexeyRomanov谢谢你的建议。我不知道转换器存在。你不能将代码字段改为整数而不是HttpStatus吗?无论您在何处拥有具有HttpStatus的业务逻辑,您都可以使用HttpStatus valueOfint statusCode来获取HttpStatus对象。@MadhuBhat在允许创建无效状态的同时,也不会给出所需的输出,而不是200。@AlexeyRomanov甚至可以将其作为字符串字段,对吗?如果没有太多的逻辑需要显式地使用HttpStatus对象,则可以将该字段作为任何类型。当然,我所说的是很明显的,但只是想看看如果没有自定义的反序列化器,我们就可以完成这项工作。即使这样,也可能不会这样做。当然,你的里程数可能会有所不同。我的意思正是你所说的。我只是想了解更多的需求。不否认你的回答:
ObjectMapper mapper = new ObjectMapper();    
SimpleModule module = new SimpleModule();
module.addSerializer(HttpStatus.class, new HttpStatusSerializer());
module.addDeserializer(HttpStatus.class, new HttpStatusDeserializer());
mapper.registerModule(module);
@NotNull
@JsonSerialize(using=HttpStatusSerializer.class)
@JsonDeserialize(using=HttpStatusDeserializer.class)
private HttpStatus code;