【问题标题】:Escaping quotes using jackson-dataformat-xml使用 jackson-dataformat-xml 转义引号
【发布时间】:2019-11-09 23:13:05
【问题描述】:

我需要jackson-dataformat-xml 方面的帮助。我需要使用XmlMapperList<String> 序列化到xml 中,并对引号"" 进行编码。

但是在序列化XmlMapper 后,编码所有其他特殊符号(<>& 等)但完全忽略引号('")...如果我对字符串进行编码在序列化之前手动操作,因为" 内部有'&' 并且它被序列化为" 而不是当然。

也许有人知道如何使它工作? 此外,有没有一种解决方法可以使用@JacksonRawValue 或类似的方法禁用List<String> 字段上的自动特殊符号编码?此注释在简单(非数组)字段上效果很好,但在 List<String> 上无法正常工作。

谢谢。

【问题讨论】:

  • 你能提供一个你序列化什么,你执行什么以及你得到什么序列化形式的例子吗?
  • 只是想把代码标签放在这里,这样可以很好地格式化..
  • @aprodymov 你可能已经理解了,所以在 cmets 中不支持多行代码格式 :) 但我明白了。您在list 中输入了什么值,生成了什么值以及您期望什么?
  • 我放了类似的东西。 aa&c"bbb. 生成:aa&c"bbb.但我期待 aa&c"bbb。
  • 如果我编码使用 StringEscapeUtils.escapeXml(value) 然后序列化它。它进入aa&c"bbb。因为它用 & 内部编码已经编码的值 - 你明白

标签: java xml jackson escaping jackson-dataformat-xml


【解决方案1】:

问题的解决方法如下。我使用了木盒 Stax2 扩展。 这有很大帮助。 https://github.com/FasterXML/jackson-dataformat-xml/issues/75

XmlMapper xmlMapper = new XmlMapper(module);
xmlMapper.getFactory().getXMLOutputFactory().setProperty(XMLOutputFactory2.P_TEXT_ESCAPER, 
new CustomXmlEscapingWriterFactory());

这里是工厂。

public class CustomXmlEscapingWriterFactory implements EscapingWriterFactory {
public Writer createEscapingWriterFor(final Writer out, String enc) {
    return new Writer(){
        @Override
        public void write(char[] cbuf, int off, int len) throws IOException {
            String val = "";
            for (int i = off; i < len; i++) {
                val += cbuf[i];
            }
            String escapedStr =  StringEscapeUtils.escapeXml(val);
            out.write(escapedStr);
        }

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

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

    public Writer createEscapingWriterFor(OutputStream out, String enc) {
        throw new IllegalArgumentException("not supported");
    }
}

【讨论】:

  • 天啊,我花了几个小时寻找如何实现EscapingWriterFactory,但你已经做到了。完美的!恭喜。我想我会将整个工作项目上传到 GitHub,但已经在早上了。今天要睡觉了。
  • @DmitriyPopov,实际上有一个错误,我在第一次尝试时使用了StringEscapeUtils.escapeXml 整个cbuf。所以连载后垃圾很多。只能使用从 0 到 len。但也许还需要off 的一些技巧:它目前未使用,我仍然不确定它在某些情况下是否会导致任何问题。总而言之,现在它正在按我的需要工作。谢谢。
  • 哦,看来我们应该从off 开始,而不是从零开始。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 2017-01-11
  • 2017-01-10
  • 2019-08-03
  • 2016-03-02
相关资源
最近更新 更多