jackson 为什么我必须使用`ESCAPE_NON_ASCII`来解析µ?

2ledvvac  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(131)

从服务Sender,我发送一个带有字符µ的JSON(UTF-8代码:0xb5)在其中一个字符串中,如下所示:

{
   "apiserver.latency.k8s.io/response-write":"1.446µs"
}

我在请求中包含了内容类型头"application/json;charset=UTF-8"
这个字符串最初保存在POJO中,所以为了将有效负载发送到Receiver服务,我使用Jackson将其转换为String,如下所示:

// myPojo is an object containing the `µ` in one of its members 
String body = objectMapper.writeValueAsString(myPojo)
ResponseEntity<String> response = restClient.postForEntity(url, body,
                    String.class);

但是,Receiver服务在抛出以下异常后会导致请求失败:

com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 start byte 0xb5

如果我使用以下命令配置ObjectMapper

objectMapper.getFactory().configure(JsonWriteFeature.ESCAPE_NON_ASCII.mappedFeature(), true);

Receiver服务现在成功地解析了请求,并允许它通过。
然而,从我所读到的,Jackson总是产生有效的JSON。那么,为什么我必须启用上述设置才能通过请求?此外,µ似乎是一个有效的UTF-8字符,这是Jackson的默认编码,那么为什么它失败了呢?
下面是我在自定义编译器中阅读有效负载的方式:

public class JsonToStringValueDeserializer extends JsonDeserializer<String> {

    private static final TypeReference<JsonNode> JSON_NODE_TYPE = new TypeReference<>(){};

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctx) throws IOException, JsonProcessingException {
        String retVal;

        if (p.currentToken().isStructStart()) {
            JsonNode val = p.readValueAs(JSON_NODE_TYPE);
            retVal = val.toString();
        } else {
            retVal = p.readValueAs(String.class);
        }

        return retVal;
    }
}

这是因为我希望这部分有效载荷在Receiver中被格式化为String,而不管发送方最初是如何发送的(我们有另一个Sender2将这部分有效载荷作为base64字符串发送)。

gblwokeq

gblwokeq1#

网友g 00 se的评论让我找到了正确的方向:我们的发送服务基于Spring,我们的版本/截至目前Spring的默认StringHttpMessageConverter以ISO-8859-1编码有效负载。

相关问题