Как отключить pretty-printing (пробел/новая строка) в XStream?

вот как я создаю экземпляр XStream для XML:

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 отключить красивую печать?

4 ответов


спасибо, ваши посты помогли!!! Вот что я использую для преобразования в строку.

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

С некоторой помощью сообщества, я понял ответ.

для 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-parameter JsonWriter.


используйте метод маршала на xstream с компактным писателем

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

поведение по умолчанию pretty-printing происходит от AbstractXmlDriver.метод createWriter () (XStream использует XppDriver в качестве драйвера иерархического потока по умолчанию, и это расширяет AbstractXmlDriver):

public HierarchicalStreamWriter createWriter(Writer out) {
    return new PrettyPrintWriter(out, getNameCoder());
}

Если вы хотите отключить pretty-printing глобально(сохраняя при этом все другие поведения по умолчанию) и просто использовать простой метод toXML (o), а не возиться с другими вариантами использования, предложенными здесь, вы можете инициализировать свой экземпляр XStream следующим образом. Это переопределяет вышеуказанный метод с CompactWriter вместо этого.

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