Как преобразовать значение с Юникодом в запросе Json в простые символы? - PullRequest
0 голосов
/ 06 декабря 2018

Иногда клиент отправляет запрос 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-запрос:

  1. Мой сервер получает запрос типа byte[];
  2. Преобразование его в io.vertx.core.json.JsonObject;
  3. Сделайте некоторые манипуляции;
  4. Сохраните в БД;

И я нашел в записях БД:

"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 Ответ

0 голосов
/ 06 декабря 2018

io.vertx.core.json.JsonObject зависит от Джексона 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, удалив один слой побега?

Для этого не существует волшебного решения.Либо напишите свою собственную конфигурацию десериализации Jackson, либо заставьте клиента перестать отправлять мусор.

...