【问题标题】:Yaml to JSON conversion on database.yml skips some special functionalitydatabase.yml 上的 Yaml 到 JSON 转换跳过了一些特殊功能
【发布时间】:2019-10-24 21:08:54
【问题描述】:

试图将 about 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】:

    当您使用锚点和别名 (&amp; / *) 或合并键 (&lt;&lt;) 时,YAML 规范中甚至没有定义,但作为 optional extension,您正在使用功能JSON 中根本不存在。

    合并键类型 (&lt;&lt;) 甚至被定义为 merging 映射,这意味着如果您使用此功能加载文档,即使您将其写回为 YAML,您也会得到打印出合并的地图,因为它是在加载文档时处理的。您只能通过使用实际上不处理合并键的实现来规避这一点(并非所有都这样做)。

    对于锚点和别名,简单的事实是 JSON 不提供类似的东西。这意味着,如果您将一个值序列化为 JSON,其中任何子节点被多次引用,则 JSON 实现别无选择,只能复制该值。

    现在当然有补救措施。该补救措施是将 YAML 输入的 结构(而不是构造值)序列化为 JSON。让我们看一下这个简单的 YAML 示例:

    - &a foo
    - *a
    

    生成的 JSON 可能如下所示:

    {
      "type": "sequence",
      "items": [
        {
          "type": "scalar",
          "anchor": "a",
          "value": "foo"
        }, {
          "type": "alias",
          "target": "a"
        }
      ]
    }
    

    此 JSON 表示保留了原始 YAML 文件的所有信息,因此可以从中重建 YAML 输入。但是 JSON 变得非常拥挤,因为我们需要将 YAML 输入的结构信息编码到对象中。问题是 JSON 对于您尝试使用它做的任何事情是否有用。

    如果这是一种可行的方法,您将需要实施它。首先,您需要一个 YAML 实现,让您可以根据 YAML 规范访问低级事件树(并非全部),请参见此图:

    所谓的事件树在大多数实现中实际上是一个事件列表,由StartSequenceEndSequence等事件组成。您将需要编写代码将此列表编码为 JSON,还需要编写代码将 JSON 解码回列表,然后您可以将其填充回 YAML 实现以获得您想要的结果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多