Вкладки не могут быть использованы для отступа при разборе строки YAML

У меня есть byte[] это представляет строку YAML в кодировке UTF-8, и я хочу десериализовать ее. Вот общий метод, который я использую:

public static <T> T getInstanceFromBinary(final Class<T> clazz, final byte[] binary, final String encoding)
        throws IOException {
    final StringReader stringReader = new StringReader(new String(binary, encoding));
    final String yamlString = stringReader.toString();
    final boolean hasTab = yamlString.contains("\t");
    final YamlReader reader = new YamlReader(stringReader);
    final T clazzInstance = reader.read(clazz);
    reader.close();
    return clazzInstance;
}

и я получаю это исключение:

Caused by: com.esotericsoftware.yamlbeans.tokenizer.Tokenizer$TokenizerException: Line 185, column 35: Tabs cannot be used for indentation.
    at com.esotericsoftware.yamlbeans.tokenizer.Tokenizer.fetchMoreTokens(Tokenizer.java:313)
    at com.esotericsoftware.yamlbeans.tokenizer.Tokenizer.peekNextToken(Tokenizer.java:120)
    at com.esotericsoftware.yamlbeans.tokenizer.Tokenizer.peekNextTokenType(Tokenizer.java:125)
    at com.esotericsoftware.yamlbeans.parser.Parser$20.produce(Parser.java:320)
    at com.esotericsoftware.yamlbeans.parser.Parser.getNextEvent(Parser.java:80)
    at com.esotericsoftware.yamlbeans.parser.Parser.peekNextEvent(Parser.java:91)
    at com.esotericsoftware.yamlbeans.YamlReader.readValueInternal(YamlReader.java:270)
    at com.esotericsoftware.yamlbeans.YamlReader.readValue(YamlReader.java:152)
    at com.esotericsoftware.yamlbeans.YamlReader.readValueInternal(YamlReader.java:295)
    ... 38 more

Проблема в том, что декодированная строка не содержит символа табуляции. Вот скриншот отладки, который подтверждает это:

Отладочная информация

Я также проверил исходный код YAMLBeans и обнаружил, где выбрасывается это исключение, хотя это не пролило свет на то, почему это происходит или как решить эту проблему.

Заранее спасибо за любые идеи.

1 ответ

Решение

Ты звонишь toString() на вашем StringReader, который возвращает загадочную и довольно бесполезную реализацию, предоставляемую Object.toString(). java.io.StringReader@329dbdbf то есть он не говорит вам, есть ли у вас вкладки или нет.

Вместо этого вам нужно проверить оригинал String вы использовали перед передачей его в StringReader и, возможно, примените .replaceAll("\t", "\\t")

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