【问题标题】:Tabs cannot be used for indentation when parsing YAML string解析 YAML 字符串时,制表符不能用于缩进
【发布时间】:2015-12-14 16:57:45
【问题描述】:

我有一个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$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 源代码,found where 抛出了这个异常,尽管这并没有说明为什么会发生这种情况或如何解决这个问题。

提前感谢您提供任何见解。

【问题讨论】:

  • 字符串没有任何制表符。我从源代码以及从 UTF-8 重新生成它之后检查了字符串。
  • @NorbertvanNobelen 我错了。该字符串确实包含制表符。
  • 实际问题是一条数据上有一个(错误的)制表符。

标签: java yaml yamlbeans


【解决方案1】:

您在 StringReader 上调用 toString(),它返回 Object.toString() 提供的神秘且相当无用的实现。 java.io.StringReader@329dbdbf 即它不会告诉你是否有标签。

相反,您需要在将其传递给 StringReader 之前检查您使用的原始 String,并可能应用 .replaceAll("\t", "\\t")

【讨论】:

  • StringReader#toString() 实际上返回 YAML 字符串,就像 StringBuffer 一样(这是 StringReader 在内部使用的 IIRC)。
  • @m0skit0:您的调试屏幕截图另有说明。 StringBuilder 和 StringBuffer 都返回支持的字符串,但 StringReader 不返回。另见stackoverflow.com/questions/17751056/…
  • @m0skit0 不是我拥有的 Java 版本,也不是您根据调试器拥有的 Java 版本。你是说java.io.StringReader@329dbdbf 是你的 YAML 吗?
  • 哦该死的,对不起,是的,你完全正确。用这个太多小时已经把我的大脑烧坏了。我已经提取了 YAML 字符串,所以我想我是从那里得到的。是的,字符串确实包含制表符,这让我想到了为什么它有它们的新问题……感谢您的帮助!
  • 实际问题是一条数据上有一个制表符。删除它工作得很好。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
相关资源
最近更新 更多