带标签的js-yaml问题

Dwa*_*man 4 yaml node.js

我目前正在尝试在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:我有什么方法可以让它忽略标签或者是否有不同的解决方法?我无法删除标签,因为这会阻止程序读取配置文件.

Jor*_*ing 5

看看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原型并为示例中的构造函数提供constructinstanceOf选项.一个非常基本的实现看起来像这样: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解析器应将其视为原样.