文章目录
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. 使用介绍
具体使用可以直接参考官方文档:
参考博客: