Как преобразовать значение с юникодом в запросе Json в простые символы?

Иногда клиент отправляет запрос 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() не могу, потому что он отменяет экранирование всех необходимых и ненужных символов '\'.

Если кто знает как решить? Или библиотека, которая это уже делает? Большое спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
189
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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, удаляя один слой экранирования?

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

Спасибо. Знаю, что где-то есть простой ответ, но не нашел.

rado 07.12.2018 07:57

Другие вопросы по теме