杰克逊反序列化程序抛出带有无效 UTF-8 中间字节的 JsonParseException,而反序列化程序带有重音的字



HTTP 请求正文示例

<Name>Cátia</Name>

HTTP 响应正文示例

<Name>C�tia</Name>

这是请求类

@JacksonXmlRootElement(localName = "Root")
public class Request {
    @JacksonXmlProperty(isAttribute = true, localName = "Id")
    private String id;
    @JacksonXmlProperty(isAttribute = true, localName = "Name")
    private String name;
}

这是 HTTP 请求

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(HttpHeaders.CONTENT_TYPE, "application/xml;charset=UTF-8");
HttpEntity<> httpEntity = new HttpEntity<>(request, httpHeaders);
responseEntity = restTemplate
    .exchange("URL", HttpMethod.POST, httpEntity, Response.class);

这是响应类

@JsonDeserialize(using = ResponseDeserializer.class)
public class Response {
    @JacksonXmlProperty(localName = "NAME")
    public String name;
}

这里是响应反序列化程序类

public class ResponseDeserializer extends JsonDeserializer<Response> {
    @Override
    public Response deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        ObjectCodec objectCodec = p.getCodec();
        JsonNode jsonNode = objectCodec.readTree(p);
        return JsonUtils.getObjectMapper().readValue(JsonUtils.getObjectMapper().writeValueAsString(jsonNode),
            Response.class);
    }
}

这是例外

JsonNode jsonNode = objectCodec.readTree(p);

readTree 方法抛出了 'com.fasterxml.jackson.core.JsonParseException'例外。无效的 UTF-8 中间字节0x74(字符 #2480,字节 #1371)

通过添加 isUTF8Support=true 作为 HTTP URL 参数来解决。

最新更新