Java 与@JsonIgnore等效,但仅适用于使用Jackson的xml字段/属性转换

Java 与@JsonIgnore等效,但仅适用于使用Jackson的xml字段/属性转换,java,xml,json,jackson,Java,Xml,Json,Jackson,我有一个类,我正在使用Jackson从/到JSON和XML进行序列化/反序列化 public class User { Integer userId; String name; Integer groupId; ... } 我希望在处理xml时忽略groupId,因此我的xml不会包含它: <User> <userId>...</userId> <name>...</name> </User>

我有一个类,我正在使用Jackson从/到JSON和XML进行序列化/反序列化

public class User {
    Integer userId;
    String name;
    Integer groupId;
...
}
我希望在处理xml时忽略groupId,因此我的xml不会包含它:

<User>
 <userId>...</userId>
 <name>...</name>
</User>
我知道@JsonIgnore在这两种语言中都可以使用,但我只想在xml中忽略它


我知道可以用来做这个()的混合注释,但是我认为应该有一个简单的注释来做这个,但是找不到它。Jackson文档(至少对我来说)并没有我想要的那么好,因为我试图找到这些东西。

Jackson不支持开箱即用。但是,您可以使用或创建一个自定义注释,该注释将被XML映射器解释为
@JsonIgnore
via

以下是一个例子:

public class JacksonXmlAnnotation {
    @Retention(RetentionPolicy.RUNTIME)
    public static @interface JsonOnly {
    }

    @JacksonXmlRootElement(localName = "root")
    public static class User {
        public final Integer userId;
        public final String name;
        @JsonOnly
        public final Integer groupId;

        public User(Integer userId, String name, Integer groupId) {
            this.userId = userId;
            this.name = name;
            this.groupId = groupId;
        }
    }

    public static class XmlAnnotationIntrospector extends JacksonXmlAnnotationIntrospector {
        @Override
        public boolean hasIgnoreMarker(AnnotatedMember m) {
            return m.hasAnnotation(JsonOnly.class) || super.hasIgnoreMarker(m);
        }
    }

    public static void main(String[] args) throws JsonProcessingException {
        User user = new User(1, "John", 23);
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.setAnnotationIntrospector(new XmlAnnotationIntrospector());
        ObjectMapper jsonMapper = new ObjectMapper();
        System.out.println(xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user));
        System.out.println(jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user));
    }
}
输出:

<root>
  <userId>1</userId>
  <name>John</name>
</root>
{
  "userId" : 1,
  "name" : "John",
  "groupId" : 23
}

1.
约翰
{
“用户ID”:1,
“姓名”:“约翰”,
“groupId”:23
}
您可以与
@JsonIgnore(false)

用户类别:

    public static class User {
      public final Integer userId;
      public final String name;
      @XmlTransient
      @JsonIgnore(false)
      public final Integer groupId;

      public User(Integer userId, String name, Integer groupId) {
        this.userId = userId;
        this.name = name;
        this.groupId = groupId;
      }
    }
将注释内省设置为ObjectMapper

ObjectMapper jsonMapper = new ObjectMapper();
jsonMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector());

如何序列化/反序列化XML?您使用的是XML映射器吗?我尝试过您的方法,它确实可以忽略属性,但是当我使用内省器时,它也会忽略所有其他jackson注释:“@JacksonXmlRootElement”,“@JacksonXmlProperty”等@raspacorp很好!我已经更新了我的答案。现在,自定义内省器从Jackson XML模块扩展了JacksonXmlAnnotationIntrospector。当我使用
@JsonProperty(value=“change\u json\u prop\u name”)
更改默认的json属性名称时,
@JsonOnly
注释将不起作用。有没有一个函数可以解决这个问题?
ObjectMapper jsonMapper = new ObjectMapper();
jsonMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector());