Java 如何在XStream中禁用漂亮打印(空白/换行)?

Java 如何在XStream中禁用漂亮打印(空白/换行)?,java,xml,json,xstream,Java,Xml,Json,Xstream,以下是我为XML创建XStream实例的方法: XStream xstream = new XStream(); 这是针对JSON的: private final XStream xstream = new XStream(new JsonHierarchicalStreamDriver() { public HierarchicalStreamWriter createWriter(Writer writer) { return new JsonWri

以下是我为XML创建XStream实例的方法:

XStream xstream = new XStream();
这是针对JSON的:

private final XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
        public HierarchicalStreamWriter createWriter(Writer writer) {
            return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
        }
    });
他们两个都在打印(缩进)输出


如何要求XStream禁用漂亮的打印?

在XStream上使用marschal方法,并使用小型编写器

xstream.marshal(someObject, new CompactWriter(out)); 

在社区的帮助下,我找到了答案

对于XML您必须更改序列化方式:

该行:

xStream.toXML(o, new OutputStreamWriter(stream, encoding));
换行

xStream.marshal(o, new CompactWriter(new OutputStreamWriter(stream, encoding)));
对于JSON您只需更改创建XStream的方式。因此,XStream的初始化更改为:

private final XStream xstreamOut = new XStream(new JsonHierarchicalStreamDriver() {
    public HierarchicalStreamWriter createWriter(Writer writer) {
        return new JsonWriter(writer, new char[0], "", JsonWriter.DROP_ROOT_MODE);
    }
});

请注意,使用了4参数的JsonWriter构造函数。

谢谢,您的帖子很有帮助!!!下面是我用来转换为字符串的内容

String strXML = "";
XStream xs = new XStream();
StringWriter sw = new StringWriter();
xs.marshal(this,  new CompactWriter(sw));
strXML = sw.toString();

pretty打印的默认行为来自AbstractXmlDriver.createWriter()方法(XStream使用XppDriver作为其默认的分层流驱动程序,这扩展了AbstractXmlDriver):

如果您想在全局范围内禁用pretty printing(同时保留所有其他默认行为),只需使用simple toXML(o)方法,而不必使用此处建议的其他每次使用选项,您可以如下初始化XStream实例。这将使用CompactWriter替代上述方法

XStream xstream = new XStream(new XppDriver() {
    @Override
    public HierarchicalStreamWriter createWriter(Writer out) {
        return new CompactWriter(out, getNameCoder());
    }
});

以以下方式创建XStream实例:

XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
        public HierarchicalStreamWriter createWriter(Writer writer) {
            return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE, new JsonWriter.Format(new char[0], new char[0], 0));
        }
});
下面是Format类的构造函数:

/**
 * Create a new Formatter.
 * 
 * @param lineIndenter the characters used for indenting the line
 * @param newLine the characters used to create a new line
 * @param mode the flags for the format modes
 * @since 1.4
 */
public Format(char[] lineIndenter, char[] newLine, int mode) {
    this(lineIndenter, newLine, mode, new NoNameCoder());
}
查看
JsonWriter
的源代码以了解更多信息

这对我很有用:

XStream stream = new XStream(new StaxDriver());
stream.toXML(messages, out);
StringWriter out = new StringWriter();
String s = out.toString();
LOG.info(s);

“marshal”和“toXML”有什么区别?这就是我现在使用的:xStream.toXML(o,新的OutputStreamWriter(stream,encoding));显然,CompactWriter只适用于XML。我已经将我的命令修改为下面的命令,现在我得到的总是XML,即使我需要JSON:xStream.marshal(o,new CompactWriter(new OutputStreamWriter(stream,encoding));请参阅JavaDoc-toXML:将对象序列化为打印精美的XML字符串。-marschal:序列化和对象到分层数据结构(如XML)。因此,使用marshal可以获得一些输出选项。JSON没有这样的选项。如何定义自己的打印编写器。漂亮的印刷品作家不能满足我的需要。我希望在每个属性和元素后面都有换行符。如何做到这一点?我们如何使用CompactWriter添加prolog或样式表?我使用new Writer().write方法添加prolog和样式表,但CompactWriter没有此功能。如何定义自己的打印编写器。漂亮的印刷品作家不能满足我的需要。我希望在每个属性和元素后面都有换行符。怎么做呢?
XStream stream = new XStream(new StaxDriver());
stream.toXML(messages, out);
StringWriter out = new StringWriter();
String s = out.toString();
LOG.info(s);