Изменение атрибута JSON Джерси Джексона во всем мире - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть сценарий, что если в POJO есть атрибут XML (определенный как @XmlAttribute), то он должен называться по-другому в выводе JSON.

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

Теперь я могу использовать @JsonPropertyопределить новое имя.Но у меня есть много таких атрибутов в каждом POJO, и требуемое изменение имени является «общим» для всех из них (скажем, добавить -new) в конце.Возможно ли сделать это глобально?

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете реализовать свой собственный 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 доступна на уровне поля, нам нужновключить видимость полей и отключить геттеры.Для ниже POJO:

class Pojo {

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

Приведенный выше пример печатает:

{"attr-new":"Attr","value":"Value"}
...