解析 YAML 字符串时不能使用制表符缩进
Tabs cannot be used for indentation when parsing YAML string
我有一个 byte[]
代表 UTF-8 编码的 YAML 字符串,我想反序列化它。这是我使用的通用方法:
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.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 源代码,found where 抛出了这个异常,尽管这并没有说明为什么会发生这种情况或如何解决这个问题。
提前感谢您的任何见解。
您在 StringReader 上调用 toString()
,returns Object.toString() 提供的神秘且无用的实现。 java.io.StringReader@329dbdbf
即它不会告诉您是否有制表符。
相反,您需要在将其传递给 StringReader 之前检查您使用的原始 String
并可能应用 .replaceAll("\t", "\t")
我有一个 byte[]
代表 UTF-8 编码的 YAML 字符串,我想反序列化它。这是我使用的通用方法:
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.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 源代码,found where 抛出了这个异常,尽管这并没有说明为什么会发生这种情况或如何解决这个问题。
提前感谢您的任何见解。
您在 StringReader 上调用 toString()
,returns Object.toString() 提供的神秘且无用的实现。 java.io.StringReader@329dbdbf
即它不会告诉您是否有制表符。
相反,您需要在将其传递给 StringReader 之前检查您使用的原始 String
并可能应用 .replaceAll("\t", "\t")