如何将Json请求中的unicode值转换成简单字符?
How to convert value with unicode in Json request into simple characters?
有时客户端会发送 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()
的变体我不能,因为它取消了所有必要和不必要的 '\' 符号。
有谁知道怎么解决吗?还是已经成功的图书馆?
非常感谢。
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 反序列化配置,要么让客户端停止发送垃圾。
有时客户端会发送 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()
的变体我不能,因为它取消了所有必要和不必要的 '\' 符号。
有谁知道怎么解决吗?还是已经成功的图书馆? 非常感谢。
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 反序列化配置,要么让客户端停止发送垃圾。