通过缩进将JSON整合到YAML中

时间:2019-01-31 16:42:28

标签: json ruby yaml chef

我正在尝试将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 :(得分:2)

通过合并散列来生成有效的红宝石对象,然后然后将结果序列化为YAML比反之容易。

@RestController
public class EventController {
    @Autowired
    EventProducer eventstream;

    @RequestMapping("/person/api/events")
public PersonEvents feed(@RequestParam(value="last", required = false) Integer last) {
    if(last == null) last = 0;
    return eventstream.from(last);
    }
}

结果:

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 基本上将符号转换为字符串。

答案 1 :(得分:-1)

首先,您需要将原始的YAML转换为JSON

make

然后,您必须将original = YAML.load(File.read(File.join('...', 'filebeat.inputs'))) # => [ { "type": "log", "enabled": true, "paths": null } ] 合并到此JSON变量中

original