使用Jackson解析YAML时忽略其余父对象仅映射InspectionModules数组的方法
方案解答
完全可以直接实现,无需调整原有YAML结构,以下是两种常用的落地方案:
前置准备
首先需要引入Jackson的YAML解析依赖(以Maven为例,Gradle对应调整即可):
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>匹配项目内Jackson主版本号即可</version> </dependency>
先定义好目标数据映射类(示例用Lombok简化get/set代码,不用Lombok自行补充对应getter、setter方法即可):
// 数组元素内嵌套的Channels对应类 @Data public class Channel { private String id; private String category; } // InspectionModules数组元素对应类 @Data public class InspectionModule { private String feature; private String name; // 如果要遵守Java驼峰命名规范,可以加@JsonProperty指定YAML内的字段名 // @JsonProperty("Channels") // private List<Channel> channels; private List<Channel> Channels; }
方案1:直接提取目标节点,无需定义外层类
这是最轻量化的方案,不需要处理无关的顶级字段:
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.fasterxml.jackson.databind.JsonNode; import java.io.File; import java.util.List; // 解析代码 YAMLMapper yamlMapper = new YAMLMapper(); // 先将整个YAML文件读为树模型 JsonNode rootNode = yamlMapper.readTree(new File("你的YAML文件路径")); // 直接提取目标数组节点,转换为InspectionModule实例列表 List<InspectionModule> modules = yamlMapper.readerForListOf(InspectionModule.class) .readValue(rootNode.get("InspectionModules"));
方案2:定义极简外层包装类,自动忽略无关字段
如果不想手动操作树模型,可以仅声明需要的字段,配置Jackson忽略未知属性即可:
首先定义外层包装类:
@Data public class YamlRoot { // 仅声明需要的目标字段,其他3个顶级字段不用管 private List<InspectionModule> InspectionModules; }
解析代码:
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.fasterxml.jackson.databind.DeserializationFeature; import java.io.File; import java.util.List; YAMLMapper yamlMapper = new YAMLMapper(); // 配置反序列化时忽略未声明的字段,避免前三个无关字段导致报错 yamlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 直接解析为外层类实例,直接获取目标数组 YamlRoot root = yamlMapper.readValue(new File("你的YAML文件路径"), YamlRoot.class); List<InspectionModule> modules = root.getInspectionModules();
两种方案都可以稳定满足需求,不需要修改原有YAML文件结构。
内容的提问来源于stack exchange,提问作者simgineer
相关产品推荐
相关产品推荐

