假设我有一个YAML文档,如下所示:
valid_true:
- true
- True
- TRUE
valid_false:
- false
- False
- FALSE
我想最终得到一个对象,它将解析的对象键与定义它们的YAML文档中的行号相关联。这样的输出可能会起作用:
{
"valid_true": {
"value": [
{"value": true, line: 2},
{"value": true, line: 3},
{"value": true, line: 4}
],
"line": 1
},
"valid_false": {
"value": [
{"value": false, line: 7},
{"value": false, line: 8},
{"value": false, line: 9}
],
"line": 6
}
}
这个图书馆能做到这一点吗?或者我需要分叉/修改它?
许多YAML库将在多个阶段执行加载任务:
- 将文档源扫描为令牌
- 将标记组成节点(标记标量、序列、映射)
- 从节点构造语言特定对象
在最后一步之后,您查找的行信息通常不再可用。只要你能通过影响对象的构造或在暴露的节点结构上构建来挂钩到加载任务中,那么你想要做的事情就相对容易
例如,PyYAML中的情况就是这样,js YAML最初基于的YAML 1.1加载程序/转储程序。但是js-yaml从那时起已经被重写以支持yaml 1.2,API似乎没有任何选项来"干扰",如前一段所述。
您可能需要查看库的较旧版本(基于PyYAML),看看它们的API是否更灵活。我还没有查看实现的细节,但我的印象是,重写取消了灵活性,转而支持速度(这本身不是一个糟糕的决定,但对像您这样的用例没有帮助)。
如果您不受javascript的限制,那么您可能需要查看NimYaml
或我自己的ruamel.yaml
(对于Python)。这些是YAML 1.2装载机/翻斗车,我确信你可以按照你需要的方式进入装载过程。
当在默认往返模式中使用时,ruamel.yaml
具有已经分配给由YAML映射和序列构建的对象的行/列信息,并且这可以相对容易地扩展到往返中使用的可用特殊标量类型(包括布尔在内的大多数类型)。或者,如果您的输入被保证在键后面有空白和/或只有注释的行,就像您的示例所做的那样,那么项目的实际行号当然可以根据列表的开头来计算。