我目前正在尝试在yaml文件中编辑2条消息,但js-yaml似乎不明白如何处理我认为第一行上的标记:
--- !Status
Default:
Description:
- |-
Message1
Message2
Samples:
Multiple: false
DynamicPlayers: false
Unknown:
PlayerName: player
PlayerCount: '???'
Favicon:
Timeout: 10s
RecursiveFolderSearch: false
ResizeStrategy: SCALE
Run Code Online (Sandbox Code Playgroud)
当我安排文件时,我得到:YAMLException: unknown tag !<!Status> at line 17, column 1:我有什么方法可以让它忽略标签或者是否有不同的解决方法?我无法删除标签,因为这会阻止程序读取配置文件.
看看examples/custom_types.jsjs-yaml repo.解决方案是创建一个新的jsyaml.Type,告诉js-yaml将!Status值视为映射,如下所示:
let StatusYamlType = new jsyaml.Type('!Status', { kind: 'mapping' });
Run Code Online (Sandbox Code Playgroud)
然后,您需要创建一个包含以下StatusYamlType类型的新架构:
let STATUS_SCHEMA = jsyaml.Schema.create([ StatusYamlType ]);
Run Code Online (Sandbox Code Playgroud)
最后,通过新的STATUS_SCHEMA,以jsyaml.safeLoad通过schema选项:
jsyaml.safeLoad(doc, { schema: STATUS_SCHEMA });
Run Code Online (Sandbox Code Playgroud)
不幸的是,看起来没有办法让js-yaml忽略所有标签,所以如果遇到其他标签,你也必须为它们定义类型.
如果您还想使用标记编写 YAML文件,!Status那么您必须实际定义Status原型并为示例中的构造函数提供construct和instanceOf选项.一个非常基本的实现看起来像这样:jsyaml.Type
function Status(data) {
Object.assign(this, data);
}
let StatusYamlType = new jsyaml.Type('!Status', {
kind: 'mapping',
instanceOf: Status,
construct: data => new Status(data),
});
Run Code Online (Sandbox Code Playgroud)
然后你传递架构jsyaml.safeDump就像你做的那样safeLoad:
jsyaml.safeDump(result, { schema: STATUS_SCHEMA })
Run Code Online (Sandbox Code Playgroud)
看看下面的代码片段,看看它的实际效果.
let doc = `--- !Status
Default:
Description:
- |-
Message1
Message2
# ...
`;
function Status(data) {
Object.assign(this, data);
}
let StatusYamlType = new jsyaml.Type('!Status', {
kind: 'mapping',
instanceOf: Status,
construct: data => new Status(data),
});
let STATUS_SCHEMA = jsyaml.Schema.create([ StatusYamlType ]);
let result = jsyaml.safeLoad(doc, { schema: STATUS_SCHEMA });
console.log(result.constructor.name, result);
console.log(jsyaml.safeDump(result, { schema: STATUS_SCHEMA }));Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/3.7.0/js-yaml.min.js"></script>Run Code Online (Sandbox Code Playgroud)
正如您所看到的,safeDump输出使用的标记语法与原始输入(!<!Status>而不是--- !Status)略有不同,但在此上下文中它们是等效的,YAML解析器应将其视为原样.
| 归档时间: |
|
| 查看次数: |
1713 次 |
| 最近记录: |