Java 如何解析YAML文件

Java 如何解析YAML文件,java,jackson,yaml,Java,Jackson,Yaml,我正在使用Jackson的YAML解析器,我希望解析YAML文件,而不必手动创建与YAML文件匹配的Java类。我能找到的所有示例都将其映射到如下对象: 提供给我的yaml文件并不总是相同的,因此我需要在运行时对其进行解析,使用jackson yaml可以实现这一点吗?就像解析JSON一样,可以解析为映射: 范例 ObjectMapper-mapper=newobjectmapper(newyamlfactory()); @抑制警告(“未选中”) Map Map=mapper.readValue

我正在使用Jackson的YAML解析器,我希望解析YAML文件,而不必手动创建与YAML文件匹配的Java类。我能找到的所有示例都将其映射到如下对象:


提供给我的yaml文件并不总是相同的,因此我需要在运行时对其进行解析,使用jackson yaml可以实现这一点吗?

就像解析JSON一样,可以解析为
映射:

范例

ObjectMapper-mapper=newobjectmapper(newyamlfactory());
@抑制警告(“未选中”)
Map Map=mapper.readValue(新文件(“test.yaml”)、Map.class);
系统输出打印项次(map);
test.yaml

订单号:A001 日期:2019-04-17 顾客姓名:顾客,乔 订单行: -项目:9号链轮 数量:12 售价:1.23 -项目:小部件(10毫米) 数量:4 售价:3.45
输出

{orderNo=A001,date=2019-04-17,customerName=Customer,Joe,orderLines=[{item=No.9链轮,数量=12,单价=1.23},{item=Widget(10mm),数量=4,单价=3.45}]

如果您不知道确切的格式,则必须将数据解析到树中并手动处理,这可能会很繁琐。我会使用可选的映射和过滤

例如:

public static final String YAML = "invoice: 34843\n"
    + "date   : 2001-01-23\n"
    + "product:\n"
    + "    - sku         : BL394D\n"
    + "      quantity    : 4\n"
    + "      description : Basketball\n"
    + "      price       : 450.00\n"
    + "    - sku         : BL4438H\n"
    + "      quantity    : 1\n"
    + "      description : Super Hoop\n"
    + "      price       : 2392.00\n"
    + "tax  : 251.42\n"
    + "total: 4443.52\n";

public static void main(String[] args) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    JsonNode jsonNode = objectMapper.readTree(YAML);

    Optional.of(jsonNode)
            .map(j -> j.get("product"))
            .filter(ArrayNode.class::isInstance)
            .map(ArrayNode.class::cast)
            .ifPresent(projectArray -> projectArray.forEach(System.out::println));
}
输出:

{"sku":"BL394D","quantity":4,"description":"Basketball","price":450.0}
{"sku":"BL4438H","quantity":1,"description":"Super Hoop","price":2392.0}

如果您不想将其解析为Java类,您希望将其解析为什么?您的意思是在运行时可能会传递不同的文件,并且无法在源代码中硬编码文件路径?