java—如何将json请求中的unicode值转换为简单字符?

ia2d9nvy  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(238)

有时客户端发送json rpc请求,json值为unicorde符号。例子:

{ "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() 我不能,因为它取消了所有必要和不必要的“\”符号。
如果有人知道怎么解决?或者是图书馆?非常感谢。

plupiseo

plupiseo1#

io.vertx.core.json.JsonObject 取决于Jackson ObjectMapper 执行实际的json反序列化(例如。 io.vertx.core.json.Json 有一个 ObjectMapper 字段)。默认情况下,jackson将转换 \u0414\u0435\u043d\u0438\u0441 进入 Денис . 您可以通过一个简单的代码段来验证这一点:

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反序列化配置,要么让客户端停止发送垃圾。

相关问题