使用 Jackson 阅读 Java 中的部分 yaml

Read part of yaml in Java using Jackson

如果我有以下代表 java Order class, order.yaml:

的 yaml(我在网上找到的)
orderNo: A001
customerName: Customer, Joe
orderLines:
  - item: No. 9 Sprockets
    quantity: 12
    unitPrice: 1.23
  - item: Widget (10mm)
    quantity: 4
    unitPrice: 3.45

我能够使用

ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
Order order = objectMapper.readValue(new File(<path_to_order>), Order.class);

但这意味着我需要提前定义 orderNoorderLines...如果我有一个带有一堆嵌套属性的巨大 yaml,这会变得非常烦人。如果我想要一个 class 而不是一个 属性 或一个 class 可以读取另一个 属性 并“忽略”其他的怎么办?这可能吗?这样我就可以指定我想要的 java 对象,而不必递归定义 yaml 的每个 属性 。谢谢!

您可以在地图中读取 json,然后从那里检索您想要的任何内容

ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
Map<String,Object> jsonMap = objectMapper.readValue(new File(<path_to_order>), Map.class);

Map 方法将失去类型安全性。没有必要定义每个 属性。您也可以在 YAML 中很好地使用 Json 注释,它只是一个历史遗留物,它被称为 Json。您要找的是 @JsonIgnoreProperties(ignoreUnknown = true).

如果您不想为每个 class 指定注释,请使用 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

public static void main(String[] args) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    Order order = objectMapper.readValue(new File("foo.yml"), Order.class);
    System.out.println(order.getOrderLines().get(0).getItem());
}


@JsonIgnoreProperties(ignoreUnknown = true)
static class Order {
    private String orderNo;
    private List<OrderLine> orderLines;

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }

    public List<OrderLine> getOrderLines() {
        return orderLines;
    }

    public void setOrderLines(List<OrderLine> orderLines) {
        this.orderLines = orderLines;
    }

    @JsonIgnoreProperties(ignoreUnknown = true)
    static class OrderLine {
        private String item;

        public String getItem() {
            return item;
        }

        public void setItem(String item) {
            this.item = item;
        }
    }
}