非法字符(CTRL-CHAR,代码0)-解析异常

时间:2020-10-14 18:51:14

标签: java jackson deserialization spring-kafka spring-cloud-stream

我目前正在遇到

class A{
    constructor(readonly a: number, readonly b: number){}
    copy(): A {
        return {
            ...this,
            b: "my string" // should be of type number!
        }
    }
}

这是因为在营业日期之前有')',并且在此之前有四个NUL,但由于它们是虚构的字符,因此未在此处显示。那是我试图映射到我的对象的json字符串的开头。我只是发送一个序列化为Avro的ByteArray,并尝试使用ByteArray Deserializer进行反序列化(我假设是问题所在)。如何摆脱那些虚构的字符,使其正确映射到我的对象,或更改我的SCS使用者配置以仅在该使用者上使用Avro反序列化。

JsonParseException: Illegal character ((CTRL-CHAR, code 0)): only regular white space (\r, \n, \t) is allowed between tokens
 at [Source: (String)"    ){"BusinessDate"

我尝试过

  // External topic listener
    @StreamListener(ChannelsScheduler.SCHEDULER_IN_FROM_EXTERNAL_EVENT)
    public void consumeMessage(@Payload GenericMessage<String> message) throws IOException
    {
        logger.info("Consumed message from external topic: {}", message);

三个都收到与上述相同的错误。

全部有效载荷:

        GPTMStatus gptmStatus = mapper.readValue(message.getPayload(), GPTMStatus.class);
        GPTMStatus gptmStatus = mapper.readValue(message.getPayload().trim(), GPTMStatus.class);
        GPTMStatus gptmStatus = mapper.readValue(message.getPayload().replace(")", ""), GPTMStatus.class);


String json = StringUtils.newStringUtf8(message.getPayload().getBytes(StandardCharsets.UTF_8));

        GPTMStatus gptmStatus = mapper.readValue(json, GPTMStatus.class);

这是我发送消息的方式:

"    ){"BusinessDate":"2020-03-05","ContentUri":"20180712_EOB/1583443159984/0.xml","DFReference":"80712_EOB","DFRevision":0,"DFVersion":1583443159984}"

1 个答案:

答案 0 :(得分:1)

此行有点误导(至少对我而言)

String json = StringUtils.newStringUtf8(message.getPayload().getBytes(StandardCharsets.UTF_8));

JSON CAN 包含NULL控制字符,但仅在转义且在字符串字段中时才包含。我建议从简单的json.replace("\0", "");开始,检查代码是否进一步。

相关问题