当前位置: 首页 > news >正文

如何使用 Jackson 处理 YAML

1. 依赖项

让我们添加 Jackson YAML 数据格式的依赖:

<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId><version>2.13.0</version>
</dependency>

我们总可以在 Maven 中央仓库找到此依赖的最新版本。

我们的 Java 对象使用了 LocalDate,所以我们也需要添加 JSR-310 数据类型的依赖:

<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId><version>2.13.0</version>
</dependency>

我们可以在 Maven 中央仓库查找它的最新版本。

2. 数据和对象结构


有了依赖问题解决之后,我们现在来看一下输入文件以及我们将要用到的 Java 类。

首先,我们来看一下将要读取的文件:

orderNo: A001
date: 2019-04-17
customerName: Customer, Joe
orderLines:- item: No. 9 Sprocketsquantity: 12unitPrice: 1.23- item: Widget (10mm)quantity: 4unitPrice: 3.45

然后,我们定义 Order 类:

public class Order {private String orderNo;private LocalDate date;private String customerName;private List<OrderLine> orderLines;// Constructors, Getters, Setters and toString
}

最后,我们来创建我们的 OrderLine 类:

public class OrderLine {private String item;private int quantity;private BigDecimal unitPrice;// Constructors, Getters, Setters and toString
}

3. 读取 YAML

我们将使用 Jackson 的 ObjectMapper 将 YAML 文件读取到 Order 对象中,所以现在我们来设置一下:

mapper = new ObjectMapper(new YAMLFactory());

我们需要使用 findAndRegisterModules 方法,以便 Jackson 能够正确处理我们的 Date:

mapper.findAndRegisterModules();

一旦我们配置好了 ObjectMapper,我们只需使用 readValue:

Order order = mapper.readValue(new File("src/main/resources/orderInput.yaml"), Order.class);

我们会发现 Order 对象已经从文件中被填充,包括 OrderLine 列表。

4. 编写 YAML

我们还将使用 ObjectMapper 将 Order 写入文件。但在开始之前,让我们为其添加一些配置:

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

添加这一行可以让 Jackson 将日期写成字符串形式,而不是单独的数字部分。

默认情况下,我们的文件将以三个破折号开始。这在 YAML 格式中是完全有效的,但我们可以通过在 YAMLFactory 上禁用该功能来关闭此功能:

mapper = new ObjectMapper(new YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER));

有了这些额外的设置,我们来创建一个 Order:

List<OrderLine> lines = new ArrayList<>();
lines.add(new OrderLine("Copper Wire (200ft)", 1, new BigDecimal(50.67).setScale(2, RoundingMode.HALF_UP)));
lines.add(new OrderLine("Washers (1/4\")", 24, new BigDecimal(.15).setScale(2, RoundingMode.HALF_UP)));
Order order = new Order("B-9910", LocalDate.parse("2019-04-18", DateTimeFormatter.ISO_DATE),"Customer, Jane", lines);

让我们使用 writeValue 来编写我们的订单:

mapper.writeValue(new File("src/main/resources/orderOutput.yaml"), order);

当我们查看 orderOutput.yaml 时,它应该类似于:

orderNo: "B-9910"
date: "2019-04-18"
customerName: "Customer, Jane"
orderLines:
- item: "Copper Wire (200ft)"quantity: 1unitPrice: 50.67
- item: "Washers (1/4\")"quantity: 24unitPrice: 0.15

http://www.lryc.cn/news/592136.html

相关文章:

  • Linux 环境下 NNG 通讯库:在嵌入式设备上应用
  • iOS WebView 调试实战 全流程排查接口异常 请求丢失与跨域问题
  • 疯狂星期四文案网第11天运营日报
  • 1 初识C++
  • iOS加固工具有哪些?项目场景下的组合策略与实战指南
  • 第一篇htmlcss详细讲解
  • 某邮生活旋转验证码识别
  • Win11安装Docker,并使用Docker安装RabbitMQ
  • 零基础入门:用按键精灵实现视频自动操作(附完整脚本)
  • Docker搭建Elasticsearch和Kibana
  • Python编程进阶知识之第二课学习网络爬虫(selenium)
  • 基于单片机智能充电器系统设计
  • logback日志控制服务器日志输出
  • 【论文精读】基于共识的分布式量子分解算法用于考虑最优传输线切换的安全约束机组组合
  • CursorIP被Ban,设置HttpProxy(亲测可用!!!)
  • 差分隐私机器学习:通过添加噪声让模型更安全,也更智能
  • 【Python】DRF核心组件详解:Mixin与Generic视图
  • Django 实战:I18N 国际化与本地化配置、翻译与切换一步到位
  • Mysql数据库——增删改查CRUD
  • Jfinal+SQLite解决MYSQL迁移表未复制索引问题,完善迁移工具
  • 算法学习笔记:29.拓扑排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • hadoop(服务器伪分布式搭建)
  • 瀚高数据库开启Oracle兼容模块
  • Oracle 11g RAC 高可用集群部署最佳实践
  • SQLite / LiteDB 单文件数据库为何“清空表后仍占几 GB”?——原理解析与空间回收实战
  • Golang 中 JSON 和 XML 解析与生成的完全指南
  • sqli-labs靶场通关笔记:第29-31关 HTTP参数污染
  • 配置本地git到gitlab并推送
  • 【LeetCode 热题 100】199. 二叉树的右视图——(解法一)BFS
  • Visual Studio编译WPF项目生成的文件介绍