使用 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);
但这意味着我需要提前定义 orderNo
和 orderLines
...如果我有一个带有一堆嵌套属性的巨大 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;
}
}
}
如果我有以下代表 java Order
class, 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);
但这意味着我需要提前定义 orderNo
和 orderLines
...如果我有一个带有一堆嵌套属性的巨大 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;
}
}
}