当前位置: 首页 > 知识库问答 >
问题:

带有SnakeYAML的嵌套构造

颛孙智勇
2023-03-14

我正在研究如何将自定义构造与SnakeYAML一起使用,但不确定如何实现嵌套。我用这个例子作为参考。

在链接的示例中,相关的YAML和构造是,

- !circle
  center: {x: 73, y: 129}
  radius: 7
private class ConstructCircle extends AbstractConstruct {
    @SuppressWarnings("unchecked")
    public Object construct(Node node) {
        MappingNode mnode = (MappingNode) node;
        Map<Object, Object> values = constructMapping(mnode);
        Circle circle = new Circle((Map<String, Integer>) values.get("center"), (Integer) values.get("radius"));
        return circle;
    }
}

现在,让我们将YAML更改为,

- !circle
  center: !point
    x: 73
    y: 129
  radius: 7

我想使用另一个abstractConstruct来解析!point对象,但要在ConstructCircle上下文中进行。我对construct/node关系的理解非常不稳定,我对如何在自定义构造函数中使用自定义构造函数感到困惑。有什么想法或资源吗?

共有1个答案

潘弘壮
2023-03-14

好吧,在用SnakeyaML做了更多的项目之后。我想我终于明白你的问题了。嵌套由SnakeyaML自动处理。你不需要担心那个。您需要做的只是为!point创建另一个构造,并将其添加到自定义构造函数类中的映射yamlConstructors中。这将在任何地方启用!point标记。

point构造可能如下所示:

class PointConstruct extends AbstractConstruct{
   public Object construct(Node node){
      String line = (String)constructScalar((ScalarNode)node);
      Pattern pointPattern = Pattern.compile("\\((\\d+),(\\d+\\)");
      Matcher m = pointPattern.matcher(line);
      if(m.find())
         return new Point(m.group(1),m.group(2));
      throw new RuntimeException("Could not parse a point");
   }
}

您的Yaml文件将如下所示:

!circle
center: !point (73,179)
radius: 7
yaml.addImplicitResolver(new Tag("!point"), Pattern.compile("\\((\\d+),(\\d+\\)"),"(");
!circle
center: (73,179)
radius: 7
!circle
center !!package.goes.here.Point
  x: 73
  y: 179
radius: 7

无论如何,希望这个答案比我上一个更清晰。

 类似资料:
  • 问题内容: 这是我在elasticsearch中存储在索引上的数据类型。我必须找到包含主要成分牛肉(且重量小于1000)和成分-(辣椒粉且重量小于250),(橄榄油和重量小于300)以及所有其他成分类似的食谱。 索引的映射是 我的查询是 但这给了Null。有人可以帮我吗?我认为我没有正确使用嵌套查询 问题答案: 试试这个:

  • 问题内容: 我目前正在研究应用程序的聊天功能。并且我在StreamBuilder中设置了AnimatedList,以使消息反向显示。这是我的代码 我的问题是该构建器从未被点击,因此AnimatedList从未被调用。我不确定设置是否正确,因此对此表示感谢。 编辑:我正在尝试使其像FirebaseAnimatedList小部件一样工作。我不知道这是否有助于了解我的目标。 谢谢 问题答案: 更新:我通

  • 根据谷歌的文档: 现在可以在片段中嵌入片段。这对于各种情况都很有用,在这些情况下,您需要将动态和可重用的UI组件放置到本身是动态和可重用的UI组件中。例如,如果使用ViewPager创建左右滑动并占用大部分屏幕空间的片段,现在可以将片段插入每个片段页面。要嵌套片段,只需对要添加片段的片段调用getChildFragmentManager()。这将返回一个FragmentManager,您可以像通常

  • 问题内容: 我正在尝试使用PostgreSQL 9.2中添加的功能将查询结果映射到JSON 。 我在找出将连接的行表示为嵌套对象(1:1关系)的最佳方式时遇到麻烦 这是我尝试过的内容(设置代码:表格,示例数据,后跟查询): 查询本身: 我发现如果使用,我可以将结果字段分离为一个子对象,但似乎仅限于一个级别。我不能插入更多的语句,因为我认为在这种情况下我需要。 为我提供了列名,因为在该表的结果中,我

  • 问题内容: 我有一个对象A的列表。此列表中的每个对象A都包含对象B的列表,而对象B包含对象C的列表。对象C包含一个属性名称,我想使用它使用Java 8进行过滤。 如何使用流在Java 8中编写以下代码以避免嵌套循环: 问题答案: 您可以使用两个,然后使用a,然后可以选择第一个,或者如果没有结果返回:

  • 我有一个带有嵌套映射的索引。我想预先形成一个查询,该查询将返回以下内容:给我搜索词中每个单词出现在一个或多个嵌套文档中的所有文档。 以下是索引: 以下是我尝试的最新查询: 例如,如果我搜索单词“食物和水”,我希望每个单词至少出现在嵌套文档中。即使只有一个单词存在,当前搜索也会返回文档 谢谢你的帮助! 更新:正如克里斯托所建议的,解决方案有效。现在我有以下问题。 这是我的索引: 我要执行的查询是,如