泽西杰克逊JSON属性全局变化

问题描述 投票:1回答:1

我有一个场景,如果POJO中有一个XML属性(定义为@XmlAttribute),那么它应该在JSON输出中以不同的方式命名。

@XmlAttribute(name = "value")
//@JsonProperty("value-new")
protected String value;

现在我可以使用@JsonProperty来定义新名称。但是我在每个POJO中都有很多这样的属性,并且所需的名称更改对于所有这些属性来说都是“常见的”(比如说add -new)。是否有可能在全球范围内这样做?

json jackson jersey-2.0
1个回答
1
投票

你可以实现自己的PropertyNamingStrategy

class XmlAttributePropertyNamingStrategy extends PropertyNamingStrategy {

    @Override
    public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
        XmlAttribute annotation = field.getAnnotation(XmlAttribute.class);
        if (annotation != null) {
            return defaultName + "-new";
        }
        return super.nameForField(config, field, defaultName);
    }
}

您可以按如下方式使用它:

ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); // enable fields
mapper.setVisibility(PropertyAccessor.GETTER, Visibility.NONE); // disable getters
mapper.setPropertyNamingStrategy(new XmlAttributePropertyNamingStrategy());

System.out.println(mapper.writeValueAsString(new Pojo()));

由于XmlAttribute注释在字段级别可用,因此我们需要启用字段可见性并禁用getter。对于POJO以下:

class Pojo {

    @XmlAttribute
    private String attr = "Attr";
    private String value = "Value";
    // getters, setters
}

以上示例打印:

{"attr-new":"Attr","value":"Value"}
© www.soinside.com 2019 - 2024. All rights reserved.