从服务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字符串发送)。
1条答案
按热度按时间gblwokeq1#
网友g 00 se的评论让我找到了正确的方向:我们的发送服务基于Spring,我们的版本/截至目前Spring的默认
StringHttpMessageConverter
以ISO-8859-1编码有效负载。