Включите JSON в YAML с отступом - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь включить JSON в файл YAML.
YAML выглядит следующим образом:
filebeat.inputs:

- type: log  
  <incorporate here with a single level indent>
  enabled: true  
  paths:  

Предположим, у вас есть следующая переменная:

a = { processors: { drop_event: { when: { or: [ {equals: { status: 500 }},{equals: { status: -1 }}]}}}}  

Я хочу включить его в существующий YAML.
Я пытался использовать:

JSON.parse((a).to_json).to_yaml

После применения я получил действительный YAML, но без отступа (всестроки должны быть с отступом) и с "---", который является новым документом Ruby в YAML.
Результат:

filebeat.inputs:
- type: log
---
processors:
  drop_event:
    when:
      or:
      - equals:
          status: 500
      - equals:
          status: -1
  enabled: true

Результат, который я ищу:

filebeat.inputs:
- type: log
  processors:
    drop_event:
      when:
        or:
        - equals:
            status: 500
        - equals:
            status: -1
  enabled: true```

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Создать действительный объект ruby ​​проще путем объединения хэшей и , а затем сериализует результат в YAML, чем наоборот.

puts(yaml.map do |hash|
  hash.each_with_object({}) do |(k, v), acc|
    # the trick: we insert before "enabled" key
    acc.merge!(JSON.parse(a.to_json)) if k == "enabled"
    # regular assignment for all hash elements
    acc[k] = v
  end
end.to_yaml)

Результат:

---
- type: log
  processors:
    drop_event:
      when:
        or:
        - equals:
            status: 500
        - equals:
            status: -1
  enabled: true

JSON.parse(a.to_json) в основном преобразует символы в строки.

0 голосов
/ 31 января 2019

Для того, чтобы сделать это в первую очередь, вам нужно конвертировать исходный YAML в JSON

original = YAML.load(File.read(File.join('...', 'filebeat.inputs')))
# => [
       {
         "type": "log", 
         "enabled": true, 
         "paths": null
       }
     ]

Затем вам нужно объединить ваш JSON в эту original переменную

original[0].merge!(a.stringify_keys)
original.to_yaml
# => 
---
-
  type: log
  enabled: true
  paths:
  processors:
    drop_event:
      when:
        or:
        - equals:
            status: 500
        - equals:
            status: -1
...