ObjectMapper - 为yaml文件添加新值

时间:2018-02-12 13:45:52

标签: java jackson yaml objectmapper filebeat

以下是我的yaml文件。要求是在“路径”下添加新行“2.log”。现在我正在阅读yaml文件Map<String, List<Map<String, Map<String, String>>>>

我的代码:

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Map<String, List<Map<String, Map<String, String>>>> obj = mapper
                        .readValue(new File("filebeat.yml"), Map.class);

obj.get("filebeat.prospectors").get(0).get("paths");
 // syso is : paths: [1.log]

现在我需要为“路径”添加新元素。

原始YAML文件:

filebeat.prospectors:
- input_type: "log"
  paths: 
    - "1.log"
  fields:
    log_type: "log1"
output.logstash:
  hosts:
  - "127.0.0.1:5044"

必需的YAML文件:

filebeat.prospectors:
- input_type: "log"
  paths: 
    - "1.log"
    - "2.log"
  fields:
    log_type: "log1"
output.logstash:
  hosts:
  - "127.0.0.1:5044"

1 个答案:

答案 0 :(得分:0)

问题中YAML的结构与数据结构并不对应。例如,input_type正确是列表元素,但output.logstash是映射条目的键,与Map<String, List<之类的结构冲突。由于这是一个容易犯的错误,因此我建议解析为树并进行修改。这是更清洁,并按照需要工作:

JsonNode tree = mapper.readTree(new File("filebeat.yml"));
((ArrayNode) tree.get("filebeat.prospectors").get(0).get("paths")).add("2.log");
System.out.println(tree.get("filebeat.prospectors").get(0).get("paths"));

ArrayNodeJsonNode的文档。 JsonNode是不可变的,您需要转换为ObjectNode或适当的ArrayNode来修改或添加元素。 readTree将文档解析为一个特殊的树数据结构,该结构可以表示任何有效的JSON,YAML,XML,而不需要具有与文档匹配的结构的Java类。更多详情herehere