Snakeyaml parece quebrar desnecessariamente valores simples em listas
Estou tentando analisar o seguinte arquivo YAML usando Groovy e Snakeyaml (claramente eu limpei os dados, mas é suficiente para demonstrar o problema):
---
info:
summary: Snakeyaml Issue
examples:
- 1st example:
name: Example 1
sublist:
- 0.1:
foo: bar
Eu esperaria as seguintes declarações:
println resource.info.summary
println resource.examples."1st example".name
println resource.examples."1st example".sublist."0.1"
produzir:
Snakeyaml Issue
Example 1
[foo:bar]
e:
println resource.examples."1st example".sublist."0.1".foo
produzir:
bar
No entanto, oreal saída de:
println resource.info.summary
println resource.examples."1st example".name
println resource.examples."1st example".sublist."0.1"
println resource.examples."1st example".sublist."0.1".foo
é:
Snakeyaml Issue
[Example 1]
[[[foo:bar]]]
[[bar]]
Só consigo obter a saída desejada incluindo as indicações da lista:
println resource.info.summary
println resource.examples[0]."1st example".name
println resource.examples[0]."1st example".sublist[0]."0.1"
println resource.examples[0]."1st example".sublist[0]."0.1".foo
o que parece desnecessário. Talvez eu esteja entendendo mal a estrutura dos dados?
Para garantir a integridade, o código do groovy que estou usando para ilustrar o problema é mostrado abaixo (peguei o código CustomerResolver na Web para que ele mantivesse flutuadores como seqüências de caracteres):
import org.yaml.snakeyaml.DumperOptions
import org.yaml.snakeyaml.Yaml
import org.yaml.snakeyaml.constructor.Constructor
import org.yaml.snakeyaml.nodes.Tag
import org.yaml.snakeyaml.representer.Representer
import org.yaml.snakeyaml.resolver.Resolver
def fileName = "example.yaml"
def Yaml yaml = new Yaml(new Constructor(), new Representer(), new DumperOptions(),
new CustomResolver())
def resource = yaml.load(new File(fileName).newInputStream())
println resource.info.summary
println resource.examples."1st example".name
println resource.examples."1st example".sublist."0.1"
println resource.examples."1st example".sublist."0.1".foo
class CustomResolver extends Resolver {
/*
* Do not resolve float and timestamp
*/
protected void addImplicitResolvers() {
addImplicitResolver(Tag.BOOL, BOOL, "yYnNtTfFoO");
addImplicitResolver(Tag.INT, INT, "-+0123456789");
addImplicitResolver(Tag.MERGE, MERGE, "<");
addImplicitResolver(Tag.NULL, NULL, "~nN\0");
addImplicitResolver(Tag.NULL, EMPTY, null);
}
}
Alguma ideia?