Обработать ввод json с недопустимой кодировкой

В моем java-приложении есть потребитель, который получает входные файлы JSON с сервера, а затем я пытаюсь преобразовать его с помощью Jackson. Но ObjectMapper выдает исключение:

com.fasterxml.jackson.databind.JsonMappingException: Invalid UTF-8 middle byte 0x2f

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

посмотри здесь stackoverflow.com/questions/6352861/…

Satya 06.02.2019 14:47

Сервер может отправить заголовок Content-Type, указывающий кодировку вместе с данными. Если кодировка не указана, по умолчанию для application/json используется UTF-8. В этом случае исправьте сервер, чтобы он отправлял правильно закодированный Json.

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

Ответы 1

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

Мне нужно было распознать кодировку и правильно обработать данные. Для этого я использовал UniversalDetector от org.mozilla.universalchardet.UniversalDetector.

private static final UniversalDetector DETECTOR = new UniversalDetector(null);

private static String getEncode(byte[] data) throws IOException {
    DETECTOR.reset();

    byte[] buf = new byte[data.length];
    InputStream is = new ByteArrayInputStream(data);

    int read;
    while ((read = is.read(buf)) > 0 && !DETECTOR.isDone()) {
        DETECTOR.handleData(buf, 0, read);
    }
    is.close();

    DETECTOR.dataEnd();
    return DETECTOR.getDetectedCharset();
}

И затем я прочитал его с правильной кодировкой:

private static String readWithEncode(byte[] data, String encoding) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data), encoding));
    StringBuilder result = new StringBuilder();
    String s;
    while ((s = br.readLine()) != null) {
        result.append(s);
    }
    br.close();
    return result.toString();
}

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