Как отключить красивую печать (пробелы/новую строку) в XStream?

StackOverflow https://stackoverflow.com/questions/894625

  •  23-08-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение 2

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

Для 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);
    }
});

Обратите внимание, что используется конструктор JsonWriter с 4 параметрами.

Другие советы

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

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

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

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

Поведение красивой печати по умолчанию происходит от метода 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());
    }
});

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top