Преобразование Yaml в JSON на database.yml пропускает некоторые специальные функции - PullRequest
0 голосов
/ 25 октября 2019

пытается преобразовать около yml в json. Когда я пытаюсь это сделать, он пропускает &, <<, *. Я перепробовал несколько вещей, но, похоже, он не создает json, как я ожидал. </p>

Я пытаюсь использовать узел для преобразования 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

convertв

{
  "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 со всеми возможностями и преобразовать его обратно в yml </p>

1 Ответ

0 голосов
/ 25 октября 2019

Когда вы используете якоря и псевдонимы (& / *) или ключ объединения (<<), который даже не определен в спецификации YAML, но является необязательным расширением , вы используете функции, которые просто не существуют в JSON.

Тип ключа слияния (<<) даже определяется как слияние отображений, что означает, что если вы загружаете документ с использованиемэта функция, даже если вы запишите ее обратно в виде 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 (это делают не все), см. Следующую диаграмму:

Что называется дерево событий в большинстве реализаций фактически является списком событий, состоящим из таких событий, как StartSequence , EndSequence и т. Д. Вам нужно будет написать код для кодирования этого спискав JSON, а также код для декодирования JSON обратно в список, который вы затем можете вставить обратно в реализацию YAML, чтобы получить желаемый результат.

Теперь есть вероятность, что это слишком многоусилия для того, что вы действительно хотите сделать. Я настоятельно рекомендую не делать этого и искать способ решения любой проблемы, которую вы решаете, без преобразования YAML в JSON, но при этом требовать сохранения функций YAML, которые отсутствуют в JSON.

...