我有一个类,我正在使用 Jackson 对 JSON、XML 进行序列化/反序列化。
public class User {
Integer userId;
String name;
Integer groupId;
...
}
我想在处理 xml 时忽略 groupId,所以我的 XML 不会包含它:
<User>
<userId>...</userId>
<name>...</name>
</User>
但是 JSON 将:
{
"userId":"...",
"name":"...",
"groupId":"..."
}
我知道@JsonIgnore 在两者中都有效,但我只想在 xml 中忽略它。
我知道可用于执行此操作的混合注释 ( https://stackoverflow.com/a/22906823/2487263 ),但我认为应该有一个简单的注释可以执行此操作,但找不到它。 Jackson 的文档(至少对我而言)不如我在寻找这类东西时想要的那么好。
最佳答案
Jackson 不支持开箱即用。但是你可以使用 the Jackson json views或创建一个自定义注释,它将通过 the annotation interospector. 为 XML 映射器解释为 @JsonIgnore
这是一个例子:
public class JacksonXmlAnnotation {
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonOnly {
}
}
@JacksonXmlRootElement(localName = "root")
public 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 class XmlAnnotationIntrospector extends JacksonXmlAnnotationIntrospector {
@Override
public boolean hasIgnoreMarker(AnnotatedMember m) {
return m.hasAnnotation(JsonOnly.class) || super.hasIgnoreMarker(m);
}
}
public class Example {
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
}
关于java - 等效于 @JsonIgnore,但仅适用于使用 Jackson 的 xml 字段/属性转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24391570/