如何使用Java / Jackson解析YAML文件并管理$ ref参考值

我正在使用Java的Jackson解析包含$ ref属性的YAML文件:

servers:
  server1:
    name: EU server
    host:
      $ref: '#/definitions/host'
  server2:
    name: USA server
    host:
      $ref: '#/definitions/host'

definitions:
  host:
    ip: 10.0.0.1
    port: 9999

代码:

    String content = ...;

    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);

    Servers servers = objectMapper.readValue(content,Servers.class);

如何配置Jackson以遵循$ ref属性?

编辑:生成的对象将具有可用的servers.server1.host.ip和servers.server1.host.port属性,而不是$ ref属性。

zsg12345 回答:如何使用Java / Jackson解析YAML文件并管理$ ref参考值

YAML中的

$ref只是一个标量,没有任何特殊含义。您可能正在使用一种为其赋予特殊含义的工具,但您没有告诉我们哪个。

Jackson能够加载YAML,但没有对特定于应用程序的架构的内置支持(YAML中的架构是将特殊属性分配给标量(例如$ref)的方法。这意味着,如果您想根据所使用的任何工具的语义来解释$ref,则需要自己实现或尽可能使用该工具的API。

如果您假设$ref是YAML功能(不是),请查看锚点和别名,它们是引用先前定义的节点的YAML方法:

foo: &bar original  # scalar `original` with anchor
bar: *bar           # reference to scalar `original`
,

您可以将SnakeYAML和Jackson结合在一起。 SnakeYAML嵌入在Jackson中(并在内部使用),因此您已经可以访问它。

首先将YAML字符串转换为Map(别名已解析):

import org.yaml.snakeyaml.Yaml;

Yaml yaml = new Yaml();
Map<String,Object> obj = yaml.load(<yamlStr>);

然后,使用Jackson将其序列化为模型:

ObjectMapper mapper = new ObjectMapper();
MyModel model = mapper.convertValue(obj,MyModel.class);
本文链接:https://www.f2er.com/3124453.html

大家都在问