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

标签 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>

但是 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/

相关文章:

java - 源代码更改时自动重新启动配置

java - Jython 中导入的类中缺少属性

c# - .xml、.ini 或 .txt 哪个读取速度快?

java - 如何访问Docker容器中存储在 'src/main/resources/someFolder'中的应用程序资源文件?

java - Unix shell : Turn file with directory names to ':' separated classpath

xml - 如何通过股票代码获取公司财务、 Assets 负债表、现金流等数据

java - spring中如何为xml中定义的带有父级的bean选择构造函数?

javascript - AngularJS:如何创建一个模型来保存输入字段动态列表的数组?

json - EXC_BAD 在 swift 中将 Any 转换为 Int 时的指令

java - JFileChooser 在 Windows 中更改默认目录