如何使用Jackson XmlMapper控制编码?

如何使用Jackson XmlMapper控制编码?,xml,jackson,jackson-dataformat-xml,Xml,Jackson,Jackson Dataformat Xml,我找不到一种(显而易见的)方法来将序列化XML的编码从默认的UTF-8更改为ISO-8859-1。我阅读了,这让我认为必须有一种方法使用xmlooutputfactory和XmlFactory来实现这一点,但我看不到一种方法来配置这些工厂,以默认使用另一种编码,只有createxmleventwitter可以传递编码 我知道如何使用ToXmlGenerator.Feature.WRITE_XML_声明生成XML声明。所以我需要的是这样的声明: <?xml version='1.0' enc

我找不到一种(显而易见的)方法来将序列化XML的编码从默认的
UTF-8
更改为
ISO-8859-1
。我阅读了,这让我认为必须有一种方法使用
xmlooutputfactory
XmlFactory
来实现这一点,但我看不到一种方法来配置这些工厂,以默认使用另一种编码,只有
createxmleventwitter
可以传递编码

我知道如何使用
ToXmlGenerator.Feature.WRITE_XML_声明
生成XML声明。所以我需要的是这样的声明:

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

当然,内容也应该用
ISO-8859-1
编码。

在中,您会发现
UTF-8
是硬编码的:

if(Feature.WRITE\uxml\u1\u1.enabledIn(\uFormatFeatures)){
_writeStartDocument(“UTF-8”、“1.1”);
}else if(Feature.WRITE_XML_DECLARATION.enabledIn(_formatFeatures)){
_writeStartDocument(“UTF-8”、“1.0”);
}否则{
返回;
}
一旦是
final
,可能就没有简单的方法来处理它了。我在项目中提交了一份报告


如果坚持使用JAXB,则可以使用以下方法控制
编码属性的值:

Marshaller-Marshaller=jaxbContext.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
setProperty(marshaller.JAXB_编码,“ISO-8859-1”);
marshaller.marshall(foo,System.out);

看到这里。

我找到的解决方案是使用自定义Jackson api和Writer,并使用您想要的编码,然后自己打印xml声明

您必须使用Writer-wrapper,因为Jackson使用反射(我认为是这样)来找出您使用的Writer类型及其编码是什么,并根据它(是否为UTF-8)对127个字符执行XML实体编码。如果您对XML实体编码感到满意,可以跳过包装器

如果你用杰克逊的

mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
根据您的本地环境,您可能会遇到创建无效XML的风险。Jackson将始终在xml声明中打印UTF-8,如果您提供了非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);
String fileName=“/tmp/file.xml”;
字符串编码=“ISO-8859-1”;
Writer output=new OutputStreamWriter(新文件输出流(文件名),编码);
输出。写入(“\n”);
mapper.writer().writeValue(新writer(输出){
@凌驾
公共void write(char[]var1,int var2,int var3)引发IOException{
写入(var1、var2、var3);
}
@凌驾
public void flush()引发IOException{
output.flush();
}
@凌驾
public void close()引发IOException{
output.close();
}
},价值);