使用 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. 使用介绍

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

参考博客:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值