Jackson YAML:支持标签

时间:2016-10-17 21:27:03

标签: jackson yaml

我正在研究将YAML用于某种复杂的元数据语言。如果YAML解析器支持使用YAML tags,那么最有用的一件事就是。这将允许使用此元数据语言编写文档的人员指示何时/是否使用定义良好的模式定义某个对象。例如:

set_one: !dset
  bass: tama rockstar 22x16
  snare: ludwig supralight 6.5x15
  tom1: tama rockstar 12x11
  tom2: tama rockstar 16x16

在上面的YAML中使用“!dset”标签是作者的一个指示,即“set_one”定义的对象应该定义一个drumset,并且应该根据对应于“dset”的模式进行解析。 ”。如果对象违反了该模式的约束之一(例如,它没有定义踩镲),则用户希望在解析时看到错误,而不会导致一些更不透明的运行时错误。< / p>

我正在解析上面的示例:

  ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
  FileInputStream fis = null;

  try
  {
      fis = new FileInputStream(file);
      JsonNode nodeTree = mapper.readTree(fis);
      examineObject(nodeTree, 0);
  }
  ...

当我在调试器中查看JsonNode的“set_one”时,我看不到任何“!dset”标记的痕迹。我可以想到杰克逊可以做很多很酷的事情(例如,使用注释将Java类与给定标记相关联,并自动将元素反序列化为该类的实例)但是,至少,我需要一些方法来发现它该节点标有“dset”。有谁知道我是否可以这样做?

1 个答案:

答案 0 :(得分:3)

JsonNode不能包含对YAML标记的任何引用,因为JSON中没有这样的结构。

请注意,Jackson是对JSON,XML,YAML等的高级抽象。你想要做的是特定于YAML - JSON和XML都没有直接等同于YAML的标签系统(XML也有标签,但它们完全不同)。因此,Jackson是使用此高级YAML功能的错误API。

杰克逊的YAML支持由SnakeYAML提供,完全能够处理标签。所以你可能想要使用SnakeYAML的API而不是Jackson。 Here是一个示例,除其他外,它注册并使用自定义标记。哦,它还能够使用注释将Java类与给定标记相关联,并自动将元素反序列化为该类的实例