从Yaml到JSON的JSON转换。yml跳过了某些特殊功能

问题描述 投票:0回答:1

尝试将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

现在从理论上讲这是正确的,但是我们有点失去了<

json yaml converters
1个回答
0
投票

[当您使用锚定和别名(& / *)或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规范访问低级事件树(并非全部如此),请参见此图:

“”

所谓的事件树在大多数实现中实际上是一个事件列表,由诸如StartSequenceEndSequence等事件组成。您将需要编写代码来对该列表进行编码转换成JSON并进行编码以将JSON解码回列表,然后您可以将其塞回到YAML实现中,以获取想要的结果。

现在,对于您实际想要做的事情来说,这太多了。我强烈建议您不要这样做,并找到一种方法来解决您要解决的任何问题,而又不将YAML转换为JSON,同时要求它保留JSON中缺少的YAML功能。

© www.soinside.com 2019 - 2024. All rights reserved.