如何使用Jackson XmlMapper控制编码?
我找不到一种(显而易见的)方法来将序列化XML的编码从默认的如何使用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
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();
}
},价值);