【问题标题】:ObjectMapper - add new value to yaml fileObjectMapper - 向 yaml 文件添加新值
【发布时间】:2018-02-12 13:45:51
【问题描述】:

以下是我的 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"

【问题讨论】:

    标签: java jackson yaml objectmapper filebeat


    【解决方案1】:

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

    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

    【讨论】:

    • 工作。谢谢你。这正是我想要的。我是 YAML ObjectMapper 的新手。你能解释一下这是如何工作的吗? mapper.readTree() 和 mapper.readValue() 有什么区别
    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 2018-10-06
    • 2015-09-08
    • 1970-01-01
    • 2012-07-09
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多