Иногда клиент отправляет запрос 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). По умолчанию Джексон конвертирует \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 с двойным экранированием, которое Джексон конвертирует в \u0414\u0435\u043d\u0438\u0441, удаляя один слой экранирования?
Для этого нет волшебного решения. Либо напишите свою собственную конфигурацию десериализации Джексона, либо заставьте клиента перестать отправлять мусор.
Спасибо. Знаю, что где-то есть простой ответ, но не нашел.