如何将 Json 请求中带有 unicode 的值转换为简单字符?

Posted

技术标签:

【中文标题】如何将 Json 请求中带有 unicode 的值转换为简单字符?【英文标题】:How to convert value with unicode in Json request into simple characters? 【发布时间】:2018-12-06 16:21:44 【问题描述】:

有时客户端会发送带有 Json 值作为 unicorde 符号的 Json-RPC 请求。 示例:

 "jsonrpc": "2.0", "method": "add", "params":  "fields": [  "id": 1, "val": "\u0414\u0435\u043d\u0438\u0441" ,  "id": 2, "val": "\u041c\u043e\u044f"  ] , "id": "564b0f7d-868a-4ff0-9703-17e4f768699d" 

如何处理 Json-RPC 请求:

    我的服务器收到byte[] 之类的请求; 转换成io.vertx.core.json.JsonObject; 进行一些操作; 保存到数据库;

我在数据库记录中发现:

"val": "\u0414\u0435\u043d\u0438\u0441"

还有这个故事中最糟糕的。如果客户尝试搜索这些数据,他会得到:

"val": "\\u0414\\u0435\\u043d\\u0438\\u0441"

所以我认为,我需要在反序列化为 JsonObject 之前将请求数据转换。 我试过了,它没有帮助:

String json = new String(incomingJsonBytes, StandardCharsets.UTF_8);
return json.getBytes(StandardCharsets.UTF_8);

我也尝试使用StandardCharsets.US_ASCII

注意:带有StringEscapeUtils.unescapeJava() 的变体我不能,因为它会转义所有必要和不必要的'\'符号。

如果有人知道如何解决它?还是已经成功的图书馆? 非常感谢。

【问题讨论】:

【参考方案1】:

io.vertx.core.json.JsonObject 依赖于 Jackson ObjectMapper 来执行实际的 JSON 反序列化(例如,io.vertx.core.json.Json 有一个 ObjectMapper 字段)。默认情况下,Jackson 会将\u0414\u0435\u043d\u0438\u0441 转换为Денис。您可以使用简单的代码 sn-p 来验证这一点:

String json = " \"jsonrpc\": \"2.0\", \"method\": \"add\", \"params\":  \"fields\": [  \"id\": 1, \"val\": \"\\u0414\\u0435\\u043d\\u0438\\u0441\" ,  \"id\": 2, \"val\": \"\\u041c\\u043e\\u044f\"  ] , \"id\": \"564b0f7d-868a-4ff0-9703-17e4f768699d\" ";
ObjectMapper mapper = new ObjectMapper();
Map map = mapper.readValue(json, Map.class);
System.out.println(map); // jsonrpc=2.0, method=add, params=fields=[id=1, val=Денис, id=2, val=Моя], id=564b0f7d-868a-4ff0-9703-17e4f768699d

客户端很可能正在发送其他内容,因为您的示例值已正确反序列化。也许它是双重转义的 \\u0414\\u0435\\u043d\\u0438\\u0441 值,Jackson 将转换为 \u0414\u0435\u043d\u0438\u0441 去除一层转义?

对此没有神奇的解决方案。要么编写自己的 Jackson 反序列化配置,要么让客户端停止发送垃圾。

【讨论】:

谢谢。我知道某处是一个简单的答案,但找不到。

以上是关于如何将 Json 请求中带有 unicode 的值转换为简单字符?的主要内容,如果未能解决你的问题,请参考以下文章

JS 将请求载荷中带有特殊字符的数据发送到服务层,我们需要转义吗?

Volley Android中带有JSON正文的POST请求

JAVA中带有JSON字符串的HTTP POST请求

如何将字符串中带有双引号的json文件加载到spark scala中的数据框中

将unicode象形图保存到mysql

字形在 Swift 中带有 ttf 文件