杰克逊根据其属性从序列化中排除对象的最简单方法是什么?
例如,假设类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
,则该对象不应序列化。
答案 0 :(得分:1)
没有直接的功能,因为序列化的工作方式,值对象本身无法决定是否要序列化。这主要是因为属性名称可能已经被写入,因此必须将某些内容写为值。 相反,它是确定包含/排除的对象属性。
有了这个,JSON过滤器(http://www.cowtowncoder.com/blog/archives/2011/09/entry_461.html)也许可以为你工作。 JSON视图太静态,无法控制级别。
另一种可能性是尝试使用处理@JsonInclude
的机器。 JsonSerializer
具有isEmpty(...)
方法,用于检查序列化程序处理类型的对象是否被视为"为空",并且可能从序列化中排除。如果您需要处理的类型数量有限,这可能会起作用。但是根据最初的问题,情况可能并非如此。
另一种可能性是进行两阶段处理:首先将POJO转换为树模型(JsonNode
),然后遍历它,删除不应包含的内容。然后,序列化树模型。