我的Java-Jersey框架REST API调用另一个服务,该服务返回以下JSON响应。我已经在日志中记录了来自子服务的响应,并且可以看到ErrorMessage
的值包含像\u2019
这样的Unicode值,而不是单引号('
)。
{ "id": "SAMPLE", "version": 1, "status": { "lastReceivedError": { "ErrorDateTime": 1576588715, "ErrorCode": "TEST3200", "ErrorMessage": "We\u2019re sorry, the content is not available." } } }
我必须将这些值映射到我的模型中,并以JSON的形式返回。我使用GSON将上述JSON字符串转换为对象。并将该对象中的值映射到我的响应对象中。我最后的传出JSON响应如下所示,其中单引号显示为问号(?
)。
{
"MyResponse": {
"success": {
"lastReceivedError": {
"errorDateTime": "2019-12-17T13:18:35Z",
"errorCode": "TEST3200",
"errorMessage": "We?re sorry, the content is not available."
}
}
}
}
我相信编码字符周围有一些问题,但是我无法解决此问题。
TL; DR眼见为实。这取决于您环境中的编码。
代码段以下代码段显示了反序列化JSON字符串(原始响应的一部分)。如果您环境的编码为UTF-8
,则Gson
将正确转换它而不指定编码。而且,如果您已经知道原始字符串是用UTF-8
编码的,则用UTF-8
和ISO-8859-1
查看它会得到不同的结果。
String jsonStr = "{\"ErrorMessage\": \"We\u2019re sorry, the content is not available.\"}";
Gson gson = new Gson();
JsonObject data = gson.fromJson(jsonStr, JsonObject.class);
System.out.println(data.toString());
System.out.println(new String(jsonStr.getBytes("UTF-8"), "UTF-8"));
System.out.println(new String(jsonStr.getBytes("ISO-8859-1"), "UTF-8"));
控制台输出
{“ ErrorMessage”:“很抱歉,该内容不可用。”}{“ ErrorMessage”:“很抱歉,该内容不可用。”}{“ ErrorMessage”:“对不起,内容不可用。”}