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

支持继承的YAML或JSON库

邢浩邈
2023-03-14

我们正在建立一个服务。它必须从文件中读取config。我们目前正在使用YAML和Jackson来反序列化YAML。我们有一种情况,我们的YAML文件需要继承/扩展另一个(多个)YAML文件。例如,类似于:

extends: base.yaml

appName: my-awesome-app

...

因此,部分配置存储在base.yaml中。是否有任何库对此提供支持?如果它允许从多个文件继承,则会加分。我们可以改为使用JSON而不是YAML。

共有1个答案

吉玉石
2023-03-14

JSON和YAML都不具备包含文件的能力。无论您做什么,都是一个预处理步骤,您将把base.yaml和实际文件放在一起。

一种粗略的方法是:

#include base.yaml
appName: my-awesome-app

这是你的档案。加载时,首先读取第一行,如果它以#include开头,则将其替换为所包含文件的内容。您需要递归地执行此操作。这基本上是C预处理器对C文件和包含的操作。

    null
private Node preprocess(final Reader myInput) {
    final Yaml yaml = new Yaml();
    final Node node = yaml.compose(myInput);
    processIncludes(node);
    return node;
}

private void processIncludes(final Node node) {
    if (node instanceof MappingNode) {
        final List<NodeTuple> values = ((MappingNode) node).getValue();
        for (final NodeTuple tuple: values) {
            if ("!include".equals(tuple.getKeyNode().getTag().getValue())) {
                final String includedFilePath =
                        ((ScalarNode) tuple.getValueNode()).getValue();
                final Node content = preprocess(new FileReader(includedFilePath));
                // now merge the content in your preferred way into the values list.
                // that will change the content of the node.
            }
        }
    }
}

public String executePreprocessor(final Reader source) {
    final Node node = preprocess(source);
    final StringWriter writer = new StringWriter();
    final DumperOptions dOptions = new DumperOptions()
    Serializer ser = new Serializer(new Emitter(writer, dOptions),
                                    new Resolver(), dOptions, null);
    ser.open();
    ser.serialize(node);
    ser.close();
    return writer.toString();
}
!include : base.yaml
appName: my-awesome-app

得到的字符串可以是Jackson的输入。

 类似资料:
  • 有没有办法在springfox swagger(2.7.0)中暴露遗传/多态性?我知道昂首阔步规范支持所有的。springfox支持这个吗?下面是示例域模型。 若控制者归还动物,那个么《大摇大摆》合同不会暴露猫或狗。它只返回带有属性的动物。

  • 本文向大家介绍C#支持多重继承么?相关面试题,主要包含被问及C#支持多重继承么?时的应答技巧和注意事项,需要的朋友参考一下 类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。 类是爹、接口是能力,能有多个能力,但不能有多个爹。

  • 我在阅读Java8中的interface时遇到了这个主题,在有些情况下,我们使用default或static关键字在interface中定义方法,允许下一个子程序重新定义相同的方法或实现它。那是不是意味着多重继承?还有一个问题,我发现,返回类型必须是协变类型,否则编译问题,这意味着它仍然不支持多重继承?我们能说java支持多重继承吗?让我知道关于这个话题的更多细节。

  • 从2.7.0开始,SpringFox Swagger不支持继承: https://github.com/springfox/springfox/issues/1983 我有一个应用程序,它依赖于swagger支持继承这一事实,但仍然需要将库更新到2.8.0版本。 真的有可能以某种方式(甚至是肮脏的方式)为继承提供向后兼容性吗? 真的非常感谢任何帮助,谢谢

  • 本文向大家介绍请说明Java是否支持多继承?相关面试题,主要包含被问及请说明Java是否支持多继承?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA多继承 Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,

  • 例如:案例1:我们创建的每个Java类是否都将扩展类,如果是这样,那么为什么我们能够扩展一个类到我们的类可能是愚蠢的问题,刚刚记住了,我发布这个问题