Jackson - 转换序列化字段值

Mr.*_*dar 3 java json jackson spring-boot

在具有 AngularJS 前端的 Spring Boot 应用程序中,序列化时必须将“Pin”字段值涂黑,即,如果 POJO 中的 Pin 字段值为 null,则相应的 JSON 字段必须保持为空;如果字段值包含数据,则必须将其替换为“***”字符串。

Jackson 是否提供了完成此任务的功能?

sha*_*zin 6

您可以像下面一样轻松完成,无需任何自定义序列化程序

public class Pojo {
    @JsonIgnore
    private String pin;

    @JsonProperty("pin")
    public String getPin() {
        if(pin == null) {
            return "";
        } else {
            return "***";
        }
    }

    @JsonProperty("pin")
    public void setPin(String pin) {
        this.pin = pin;
    }

    @JsonIgnore
    public String getPinValue() {
        return pin;
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以使用它Pojo.getPinValue()来获取准确的值。

  • 虽然 Anton Belev 发布的方法在架构方面是一种更干净的方法,但我更喜欢这个方法,因为它是一种快速且小型的解决方案:-) (2认同)

Ant*_*lev 5

尝试以下示例。

\n\n
public class Card {\n    public int id;\n    public String pin;\n}\n\npublic class CardSerializer extends StdSerializer<Card> {\n\n    public CardSerializer() {\n        this(null);\n    }\n\n    public CardSerializer(Class<Card> t) {\n        super(t);\n    }\n\n    @Override\n    public void serialize(Card value, JsonGenerator jgen, SerializerProvider provider) \n      throws IOException, JsonProcessingException {\n        jgen.writeStartObject();\n        jgen.writeNumberField("id", value.id);\n        jgen.writeStringField("pin", "****");\n        jgen.writeEndObject();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你需要注册你的客户序列化器ObjectMapper

\n\n
Card card = new Card(1, "12345");\nObjectMapper mapper = new ObjectMapper();\n\xc2\xa0\nSimpleModule module = new SimpleModule();\nmodule.addSerializer(Card.class, new CardSerializer());\nmapper.registerModule(module);\nString serialized = mapper.writeValueAsString(card);\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以在此处进行一些改进,例如直接在类上注册序列化器,但您可以在此处阅读更多相关信息第 4 节 - http://www.baeldung.com/jackson-custom-serialization

\n