包括snakeyaml中的YAML文件
我希望YAML文件包含一个include,类似于这个问题,但包含Snakeyaml: 例如:包括snakeyaml中的YAML文件,yaml,snakeyaml,Yaml,Snakeyaml,我希望YAML文件包含一个include,类似于这个问题,但包含Snakeyaml: 例如: %YAML 1.2 --- !include "load.yml" !include "load2.yml" 我有很多麻烦。我已经定义了构造函数,我可以让它导入一个文档,但不能导入两个。我得到的错误是: Exception in thread "main" expected '<document start>', but found Tag in 'reader', line 5,
%YAML 1.2
---
!include "load.yml"
!include "load2.yml"
我有很多麻烦。我已经定义了构造函数,我可以让它导入一个文档,但不能导入两个。我得到的错误是:
Exception in thread "main" expected '<document start>', but found Tag
in 'reader', line 5, column 1:
!include "load2.yml"
^
问题是,有没有人对Snakeyaml做过类似的事情?关于我可能做错了什么有什么想法吗?我看到两个问题:
final InputStream input = new FileInputStream(new File("src/imports/" + value));
final Yaml yaml = new Yaml(constructor);
return yaml.loadAll(input);
您应该使用yaml.load(输入)
,而不是yaml.loadAll(输入)
。该方法返回多个对象,但construct()
方法希望返回单个对象
另一个问题是,您可能对工作方式有一些不一致的期望:
如果您认为您的!include
的工作原理与C语言中的一样,在C语言中,预处理器插入包含文件的内容,实现它的方法是在表示阶段(解析)或序列化阶段(编写)处理它。但是您已经在表示阶段(构造)实现了它,所以!include
返回一个对象,YAML文件的结构必须与此一致
假设您有以下文件:
test1a.yaml
activity: "herding cats"
test1b.yaml
33
test1.yaml
favorites: !include test1a.yaml
age: !include test1b.yaml
这可以正常工作,相当于
favorites:
activity: "herding cats"
age: 33
但以下文件不起作用:
!include test1a.yaml
!include test1b.yaml
因为没有什么可以说明如何在更大的层次结构中组合这两个值。如果需要阵列,则需要执行以下操作:
- !include test1a.yaml
- !include test1b.yaml
或者,再一次,在早期阶段(如解析或组合)处理此自定义逻辑
或者,您需要告诉YAML库您正在启动第二个文档(这是错误所抱怨的:
预期为“”
),因为YAML支持单个.YAML文件中的多个“文档”(顶级值) 另外,感谢您发布此问题;它让我在支持方面领先一步!包括
标记。
- !include test1a.yaml
- !include test1b.yaml