【问题标题】:Jersey Jackson JSON attribute change globally泽西杰克逊 JSON 属性在全球范围内更改
【发布时间】:2019-02-18 14:54:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: json jackson jersey-2.0


    【解决方案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"}
    

    【讨论】:

    • 谢谢。我有想法通过 JSonserialization 实现,但这看起来更简单。如果字段显式命名才能使其工作,还必须启用功能@​​987654328@。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2012-06-07
    • 2014-02-12
    相关资源
    最近更新 更多