杰克逊:基于其属性从序列化中排除对象

时间:2015-04-25 00:18:27

标签: jackson

杰克逊根据其属性从序列化中排除对象的最简单方法是什么?

例如,假设类import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyFrame extends JFrame { class MyActionListener implements ActionListener { JPanel panel; MyActionListener(JPanel _panel) { panel = _panel; } @Override public void actionPerformed(ActionEvent ae) { MyFrame.this.add(panel, BorderLayout.CENTER); //MyFrame.this.revalidate(); //MyFrame.this.repaint(); panel.revalidate(); panel.repaint(); } } JPanel buttonPanel = new JPanel(); JButton firstButton = new JButton("first"); JPanel firstPanel = new JPanel(); JTextPane firstPane = new JTextPane(); JTextField firstField = new JTextField("first field"); JButton secondButton = new JButton("second"); JPanel secondPanel = new JPanel(); JTextPane secondPane = new JTextPane(); JTextField secondField = new JTextField("second field"); MyFrame() { firstPane.setText("first pane"); firstPanel.setLayout(new BorderLayout()); firstPanel.add(firstPane, BorderLayout.CENTER); firstPanel.add(firstField, BorderLayout.SOUTH); firstButton.addActionListener(new MyActionListener(firstPanel)); secondPane.setText("second pane"); secondPanel.setLayout(new BorderLayout()); secondPanel.add(secondPane, BorderLayout.CENTER); secondPanel.add(secondField, BorderLayout.SOUTH); secondButton.addActionListener(new MyActionListener(secondPanel)); buttonPanel.setLayout(new GridLayout(0,1)); buttonPanel.add(firstButton); buttonPanel.add(secondButton); add(buttonPanel, BorderLayout.WEST); add(firstPanel, BorderLayout.CENTER); setSize(new Dimension(300,300)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new MyFrame(); } } 的实例o具有C字段。如果boolean enabled,则该对象不应序列化。

另外,如何将此工作与当前的JSON视图结合使用?例如,假设类o.enabled == false的实例o具有C字段。如果boolean topSecret,并且当前的JSON视图不是o.topSecret == true,则该对象不应序列化。

1 个答案:

答案 0 :(得分:1)

没有直接的功能,因为序列化的工作方式,值对象本身无法决定是否要序列化。这主要是因为属性名称可能已经被写入,因此必须将某些内容写为值。 相反,它是确定包含/排除的对象属性。

有了这个,JSON过滤器(http://www.cowtowncoder.com/blog/archives/2011/09/entry_461.html)也许可以为你工作。 JSON视图太静态,无法控制级别。

另一种可能性是尝试使用处理@JsonInclude的机器。 JsonSerializer具有isEmpty(...)方法,用于检查序列化程序处理类型的对象是否被视为"为空",并且可能从序列化中排除。如果您需要处理的类型数量有限,这可能会起作用。但是根据最初的问题,情况可能并非如此。

另一种可能性是进行两阶段处理:首先将POJO转换为树模型(JsonNode),然后遍历它,删除不应包含的内容。然后,序列化树模型。