java - ObjectMapper - 向 yaml 文件添加新值

标签 java jackson yaml objectmapper filebeat

下面是我的 yaml 文件。要求是在“paths”下添加新行“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"

最佳答案

问题中的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"));

ArrayNode 的文档和 JsonNodeJsonNode是不可变的,您需要转换为 ObjectNode或者如果合适的话ArrayNode修改或添加元素。 readTree将文档解析为特殊的树数据结构,可以表示任何有效的 JSON、YAML、XML,而不需要具有与文档匹配的结构的 Java 类。更多详情herehere

关于java - ObjectMapper - 向 yaml 文件添加新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48747975/

相关文章:

java - 从SpringBoot获取protobuf消息对象列表

amazon-web-services - 具有资源属性 CloudFormation 的 UserData 脚本

java - 如何递归查找网站上的所有URL——java

android - Jackson 2 - 在 Android 上使用 Retrofit REST-API 将字符串直接反序列化为 Date

java - 为什么我在尝试解析 .docx 文件时遇到异常?

java - 如何比较 JSON 文档并返回与 Jackson 或 Gson 的差异?

php - 在路由中排除路径

amazon-web-services - 如何将 JSON 类型传入 yaml cloudformation 模板

java - 如何使用 hibernate 管理具有多个数据库角色(用户)的 web 应用程序?

java - Log4j2 配置 - 如果没有为记录器设置 AppenderRef 会发生什么?