Как отключить симпатичную печать (пробел / перевод строки) в XStream? - PullRequest
21 голосов
/ 21 мая 2009

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

Ответы [ 5 ]

19 голосов
/ 17 августа 2009

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

String strXML = "";
XStream xs = new XStream();
StringWriter sw = new StringWriter();
xs.marshal(this,  new CompactWriter(sw));
strXML = sw.toString();
12 голосов
/ 23 мая 2009

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

Для 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.

4 голосов
/ 21 мая 2009

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

xstream.marshal(someObject, new CompactWriter(out)); 
1 голос
/ 13 февраля 2015

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

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

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

XStream xstream = new XStream(new XppDriver() {
    @Override
    public HierarchicalStreamWriter createWriter(Writer out) {
        return new CompactWriter(out, getNameCoder());
    }
});
0 голосов
/ 07 февраля 2019

Создайте свой экземпляр 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 для получения дополнительной информации

...