如何将 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请求