Джексон ObjectMapper превращает символ евро в мусорный персонаж - PullRequest
1 голос
/ 30 января 2020

У меня есть объект, у которого есть поле currencySymbol, в котором символ евро хранится в одном из его свойств типа String. Когда я конвертирую этот объект в json с помощью Object mapper, символ евро преобразуется в ненужный символ. Ниже приведен код, который я использую. Нужно ли выполнять какие-либо настройки кодировки символов перед преобразованием в JSON

public String convertObjectToJson(Object obj) {
    long start = System.currentTimeMillis();
    objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    String jsonBody = null;
    try {
        jsonBody = objectMapper.writeValueAsString(obj);
    } catch (JsonProcessingException e) {
        logger.info(e.getMessage(), e.fillInStackTrace());
    }
    logger.debug("Conversion time for object to json :: " + (System.currentTimeMillis() - start) / 1000d);
    return jsonBody;
}

Входной объект: {"currencySymbol": "₹", "currencyFormat": "₹ 0; - ₹ 0"} JSON output: {"currencySymbol": "Ç", "currencyFormat": "Ç0; -Ç0"} Как вы можете видеть после конвертации, символ «Индийская рупия» ₹ превращается в символ барахла. То же самое происходит и с символом евро €

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Я могу решить эту проблему, установив для параметра конфигурации JsonGenerator.Feature.ESCAPE_NON_ASCII значение true. Ниже приведен рабочий код

public String convertObjectToJson(Object obj) {
    long start = System.currentTimeMillis();
    objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    objectMapper.getFactory().configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
    String jsonBody = null;
    try {
        jsonBody = objectMapper.writeValueAsString(obj);
    } catch (JsonProcessingException e) {
        logger.info(e.getMessage(), e.fillInStackTrace());
    }
    logger.debug("Conversion time for object to json :: " + (System.currentTimeMillis() - start) / 1000d);
    return jsonBody;
}
0 голосов
/ 13 февраля 2020

Я отправлю ответ, потому что он может быть полезен кому-то еще.

У меня была похожая проблема, но оказалось, что это не вина Джексона.

Я пытался сериализовать строку, содержащую символ , в строку JSON с использованием библиотеки Джексона (версия 2.8.6 ).

Я попытался отладить свой код, чтобы увидеть значение из сериализованной строки JSON, которая содержала символ , но в консоли и в файлах журнала я всегда видел символ барахла.

Таким образом, возникла проблема с кодировкой, используемой моей консолью и моей системой ведения журналов.

Просто для справки, вот ответ о том, как явно установить кодировку, используемую приложением Logback. После настройки этой кодировки я смог увидеть символ в моих файлах журнала.

...