Java 与@JsonIgnore等效,但仅适用于使用Jackson的xml字段/属性转换
我有一个类,我正在使用Jackson从/到JSON和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>
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());