使用 SnakeYAML 进行 YAML 相关操作

文章目录


1. 接触背景

公司这边有一部分项目是用 Ruby 实现的。而 Ruby 同事喜欢在数据库存储yaml文本,最近使用 Java 重构 Ruby 项目,就遇到了解析yaml文本的问题,所以研究了下SnakeYAML这个库。

一般他们会在相关表中的text类型的字段中存储yaml文本,Java 程序员一般是存储json文本。下面就说下我解析该类型字段的过程。目前遇到的有两种 Ruby 项目存储的yaml文本。

(1)没有ruby头的yaml文本:

---
- title: "正常"
  next_level: '5'
  color: "#32FE40"
- title: "延迟"
  next_level: '10'
  color: "#F6FF19"
- title: "超时"
  next_level: '15'
  color: "#FF3E3E"
- title: "严重超时"
  next_level: '20'
  color: "#FFFFFF"

这种直接使用SnakeYAML可以直接解析。

import org.yaml.snakeyaml.Yaml;
...
Yaml yaml = new Yaml();
List<Map> list = yaml.loadAs(yamlStr, List.class);

(2)有ruby头的yaml文本:

---
- !ruby/hash:ActionController::Parameters
  title: "处理中"
  next_level: '3'
  color: "#15E584"
- !ruby/hash:ActionController::Parameters
  title: "已超时"
  next_level: '5'
  color: "#EB8212"
- !ruby/hash:ActionController::Parameters
  title: "严重超时"
  next_level: '10'
  color: "#F10F64"

可以看到,该yaml文本有一个!ruby/hash:ActionController::Parameters标记。咨询了 Ruby 同事,说是和 Ruby 的版本有关,他们进行了版本更新,数据库中新数据都会带这个头。如果此时还直接用上面的方法解析,会报一个错误:

Exception in thread "main" Can't construct a java object for !ruby/hash:ActionController::Parameters; exception=Invalid tag: !ruby/hash:ActionController::Parameters
 in 'string', line 2, column 3:
    - !ruby/hash:ActionController::Par ... 
      ^

所以,需要将这个头删除掉,直接替换为空串,就能正常处理了。

import org.yaml.snakeyaml.Yaml;

yamlStr =  yamlStr.replace("!ruby/hash:ActionController::Parameters", "");
Yaml yaml = new Yaml();
List<Map> list = yaml.loadAs(yamlStr, List.class);

2. 使用介绍

具体使用可以直接参考官方文档:

参考博客:

上一篇:【Laravel3.0.0源码阅读分析】url类url.php


下一篇:导入源码SpringBoot碰到的痛点