尽管它是字符串,但将xml属性视为纯字节

时间:2018-08-08 09:18:11

标签: java xml character-encoding jackson jackson-dataformat-xml

我必须重写一个非常大的旧应用程序(PROD)。为了检查我新编写的(微服务)应用程序是否按预期工作,我使用了旧应用程序的一些输出。这样,我就可以使用某种测试数据来测试我的新应用程序部件。但是,该旧应用程序会生成UTF-8格式的XML输出,但使用Win-CP1252编码的一个属性(有效负载)除外。 (旧版软件,不要问为什么)。

以下是原始消息:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<hist DatakindId="12356" 
      Id="68415"
      ReceiveTime="Wed Aug 08 09:06:20 CEST 2018"
      Retries="0"
      token="foobar"
      SendTime="Wed Aug 08 09:06:48 CEST 2018"
      payload="# Fehler bei der Durchf[0xfc]hrung" <-- Actual (cannot use broken char in SO :-()
      payload="# Fehler bei der Durchführung" <-- If it was in UTF-8
/>

使用杰克逊的XML-Mapper时,将导致以下异常:

com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 start byte 0xfc (at char #736, byte #53)
    at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwAsParseException(StaxUtil.java:37)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._initializeXmlReader(XmlFactory.java:657)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:593)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:29)
    at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:857)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3091)
    ...

使用此数据类:

@JacksonXmlRootElement(localName = "hist")
public class Hist {

    [...]

    @JsonProperty("ReceiveTime")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "EEE MMM dd HH:mm:ss z yyyy", locale = "en")
    public ZonedDateTime receiveTime;

    @JsonProperty("payload")
    public String payload;

}

所以我想:如果杰克逊无法解析,那就把它当作普通字节对待吧

private static final Charset PAYLOAD_CHARSET = Charset.forName("Cp1252");

public String payload;

@JsonProperty("payload")
public void setPayload(byte[] payload) {
    this.payload = new String(payload, PAYLOAD_CHARSET);
}

但是,这导致杰克逊试图使用base64(?)来解码输入,从而导致以下异常:

Illegal character '#' (code 0x23) in base64 content

TLDR:我怎么能告诉Jackson我只想要有效载荷的字节而没有base64或任何其他编码?

有内置的东西吗?还是可以通过某种自定义解串器来实现?

0 个答案:

没有答案