尝试将yml转换为json。当我尝试执行此操作时,它会跳过&,<
我正在尝试使用node将yml转换为json,反之亦然。
development-mysql: &development-mysql
pool: 5
encoding: utf8
host: 127.0.0.1
port: 1234
alpha: &alpha
<<: *development-mysql
adapter: oracle
database: testDB
username: test
time_zone: UTC
转换为
{
"development-mysql": {
"pool": 5,
"encoding": "utf8",
"host": "127.0.0.1",
"port": 1234
},
"alpha": {
"pool": 5,
"encoding": "utf8",
"host": "127.0.0.1",
"port": 1234,
"adapter": "oracle",
"database": "testDB",
"username": "test",
"time_zone": "UTC"
}
}
当我尝试将其转换回yml时是这样的
development-mysql:
pool: 5
encoding: utf8
host: 127.0.0.1
port: 1234
alpha:
pool: 5
encoding: utf8
host: 127.0.0.1
port: 1234
adapter: oracle
database: testDB
username: test
time_zone: UTC
现在从理论上讲这是正确的,但是我们有点失去了<
[当您使用锚定和别名(&
/ *
)或YAML规范中甚至没有定义但作为<<
的合并键(optional extension)时,所使用的功能根本不存在于JSON中。
合并键类型(<<
)甚至被定义为merging映射,这意味着,如果您使用此功能加载文档,即使您将其写回YAML,也会得到打印的合并图退出,因为它是在加载文档时处理的。您只能通过使用实际上不处理合并键(并非全部都可以)的实现来规避此问题。
使用锚和别名,简单的事实是JSON不提供类似的东西。这意味着,如果您将值序列化为JSON(其中多次引用任何子节点),则JSON实现别无选择,只能复制该值。
现在当然有补救方法。该补救措施是将YAML输入的structure(而不是构造值)序列化为JSON。让我们看一下这个简单的YAML示例:
- &a foo
- *a
生成的JSON可能看起来像这样:
{
"type": "sequence",
"items": [
{
"type": "scalar",
"anchor": "a",
"value": "foo"
}, {
"type": "alias",
"target": "a"
}
]
}
此JSON表示保留了原始YAML文件的所有信息,因此可以从中重建YAML输入。但是,由于我们需要将YAML输入的结构信息编码为对象,因此JSON变得很塞满。问题是,JSON是否对您尝试使用的东西有用?
如果这是可行的方法,则需要实施。首先,您需要一个YAML实现,该实现可让您根据YAML规范访问低级事件树(并非全部如此),请参见此图:
所谓的事件树在大多数实现中实际上是一个事件列表,由诸如StartSequence,EndSequence等事件组成。您将需要编写代码来对该列表进行编码转换成JSON并进行编码以将JSON解码回列表,然后您可以将其塞回到YAML实现中,以获取想要的结果。
现在,对于您实际想要做的事情来说,这太多了。我强烈建议您不要这样做,并找到一种方法来解决您要解决的任何问题,而又不将YAML转换为JSON,同时要求它保留JSON中缺少的YAML功能。