Snakeyaml appears to unnecessarily wrap simple values in lists(Snakeyaml 似乎不必要地将简单值包装在列表中)
问题描述
我正在尝试使用 Groovy 和 Snakeyaml 解析以下 YAML 文件(显然我已经清理了数据,但足以证明问题):
I am attempting to parse the following YAML file using Groovy and Snakeyaml (clearly I have sanitised the data but it is sufficient to demonstrate the issue):
---
info:
summary: Snakeyaml Issue
examples:
- 1st example:
name: Example 1
sublist:
- 0.1:
foo: bar
我希望得到以下陈述:
println resource.info.summary
println resource.examples."1st example".name
println resource.examples."1st example".sublist."0.1"
屈服:
Snakeyaml Issue
Example 1
[foo:bar]
和:
println resource.examples."1st example".sublist."0.1".foo
屈服:
bar
但是,实际输出来自:
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]]
我只能通过包含列表索引来获得所需的输出:
I can only get the desired output by including the list indicies:
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
这似乎是不必要的.也许我误解了数据的结构?
which seems unnecessary. Perhaps I am misunderstanding the structure of the data?
为了完整起见,我用来说明问题的常规代码如下所示(我从网上抓取了 CustomerResolver 代码,以便将浮点数保持为字符串):
For completeness, the groovy code that I am using to illustrate the issue is shown below (I grabbed the CustomerResolver code off the web so that it would keep floats as strings):
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 ");
addImplicitResolver(Tag.NULL, EMPTY, null);
}
}
有什么想法吗?
推荐答案
你如何访问yaml的问题
the problem in a way how you access the yaml
examples
首先包含 list
,然后才包含 object
键为 1st example
the examples
first contains list
and only then contains object
with key 1st example
对于您的情况,请尝试以下访问:
for your case try this access:
println resource.info.summary
println resource.examples[0]."1st example"
println resource.examples[0]."1st example".name
println resource.examples[0]."1st example".sublist[0]
println resource.examples[0]."1st example".sublist[0]."0.1"
println resource.examples[0]."1st example".sublist[0]."0.1".foo
要了解列表访问器的工作原理,请查看以下示例:
to understand how list accessor works check this example:
@Grab(group='org.yaml', module='snakeyaml', version='1.18')
import org.yaml.snakeyaml.Yaml
def Yaml yaml = new Yaml()
def resource = yaml.load(new StringReader('''---
info:
summary: Snakeyaml Issue
examples:
- 1st example:
name: Example 1
- 1st example:
name: Example 2
- 1st example:
xname: Example 3
- 2nd example:
name: Example 4
'''))
println resource.examples."1st example"
//prints> [[name:Example 1], [name:Example 2], [xname:Example 3], null]
println resource.examples."1st example".name
//prints> [Example 1, Example 2, null]
这篇关于Snakeyaml 似乎不必要地将简单值包装在列表中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Snakeyaml 似乎不必要地将简单值包装在列表中
基础教程推荐
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- 降序排序:Java Map 2022-01-01