Как управлять кодировкой с помощью Jackson XmlMapper? - PullRequest
0 голосов
/ 12 октября 2018

Я не могу найти (n очевидный) способ изменить кодировку для сериализованного XML со значения по умолчанию UTF-8 на ISO-8859-1.Я прочитал Руководство по использованию , которое заставляет меня думать, что должен быть способ использования XMLOutputFactory с XmlFactory для достижения этой цели, но я не вижу способа настроить какую-либо из этих фабрик для использованиядругая кодировка по умолчанию, есть только createXMLEventWriter, где я мог бы передать кодировку.

Я знаю, как сгенерировать декларацию XML, используя ToXmlGenerator.Feature.WRITE_XML_DECLARATION.Поэтому мне нужно следующее объявление:

<?xml version='1.0' encoding='ISO-8859-1'?>

И, конечно, содержимое должно быть также закодировано в ISO-8859-1.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Решение, которое я нашел, состоит в том, чтобы использовать пользовательский API Джексона с Writer с нужной вам кодировкой и печатать декларацию xml самостоятельно.

Вы должны использовать оболочку Writer, потому что Джексон использует отражение (я думаю, что это так)выясните, какой тип писателя вы используете, и какова его кодировка, и в зависимости от того, выполняет ли она кодирование объектов XML с кодом выше 127 (если это не UTF-8). Если вас устраивает кодирование объектов XML, вы можете пропустить оболочку.

если вы используете

mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);

Джексона, вы рискуете создать недопустимый XML в зависимости от вашей локальной среды.Джексон всегда будет печатать UTF-8 в объявлении xml, и если вы предоставляете поток с кодировкой, отличной от utf-8 (а некоторые конструкторы писателей не позволяют вам указать кодировку и использовать платформу по умолчанию - которая может меняться между платформами), вы можете получитьТело документа, закодированное не так, как заголовок объявления xml, заставит вас поверить.

String fileName = "/tmp/file.xml";
String encoding = "ISO-8859-1";
Writer output = new OutputStreamWriter(new FileOutputStream(fileName), encoding);

output.write("<?xml version=\"1.0\" encoding=\"" + encoding + "\" ?>\n");
mapper.writer().writeValue(new Writer(output) {
    @Override
    public void write(char[] var1, int var2, int var3) throws IOException {
        output.write(var1, var2, var3);
    }

    @Override
    public void flush() throws IOException {
        output.flush();
    }

    @Override
    public void close() throws IOException {
        output.close();
    }

}, value);
0 голосов
/ 12 октября 2018

В ToXmlGenerator исходном коде вы обнаружите, что UTF-8 жестко запрограммирован:

if (Feature.WRITE_XML_1_1.enabledIn(_formatFeatures)) {
    _xmlWriter.writeStartDocument("UTF-8", "1.1");
} else if (Feature.WRITE_XML_DECLARATION.enabledIn(_formatFeatures)) {
    _xmlWriter.writeStartDocument("UTF-8", "1.0");
} else {
    return;
}

Once ToXmlGenerator - это final, возможно, нелегко справиться с этим.Я отправил выпуск в проекте jackson-dataformat-xml.


Если вы придерживаетесь JAXB, вы можете контролировать значение encodingатрибут Marshaller.JAXB_ENCODING:

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
marshaller.marshal(foo, System.out);

См. ответ .

...