首页 > 解决方案 > 使用 Jackson 读取 Java 中的部分 yaml

问题描述

如果我有以下 yaml(我在网上找到)代表一个 javaOrder类,order.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,这会很烦人。如果我想要一个可以读取一个属性的类或一个可以读取另一个属性并“忽略”其他属性的类怎么办?这甚至可能吗?这样我就可以指定我想要的 java 对象,而不必递归地定义 yaml 的每个属性。谢谢!

标签: javajacksonyaml

解决方案


Map 方法将使您失去类型安全性。无需定义每个属性。您也可以将 Json 注释与 YAML 一起使用,这只是一个历史遗留问题,它被称为 Json。您正在寻找的是@JsonIgnoreProperties(ignoreUnknown = true).

如果您不想为每个类指定 Annotation,请使用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;
        }
    }
}

推荐阅读