Как отключить красивую печать (пробел/новая линия) в 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 отключить красивую печать?
Ответы
Ответ 1
С некоторой помощью со стороны сообщества я понял ответ.
Для 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.
Ответ 2
Спасибо, ваши сообщения помогли!!! Вот что я использую для преобразования в String.
String strXML = "";
XStream xs = new XStream();
StringWriter sw = new StringWriter();
xs.marshal(this, new CompactWriter(sw));
strXML = sw.toString();
Ответ 3
Использовать метод marschal для xstream с компактным писателем
xstream.marshal(someObject, new CompactWriter(out));
Ответ 4
Поведение по умолчанию довольно печатается из метода 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());
}
});
Ответ 5
Создайте свой экземпляр 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
для получения дополнительной информации