杰克逊 YAML 解析器删除了特殊字符



我在将 ObjectMapper 与 YAMLFactory 一起使用解析 YAML 文件时遇到问题

  1. 我正在尝试解析的 YAML 文件:https://drive.google.com/open?id=1Q85OmjH-IAIkordikLTsC1oQVTg8ggc8
  2. 使用 readValue 解析文件,如下所示:

    ObjectMapper mapper = new ObjectMapper(new YAMLFactory().enable(Feature.MINIMIZE_QUOTES)// .disable(Feature.WRITE_DOC_START_MARKER)// .disable(YAMLGenerator.Feature.SPLIT_LINES)); TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {}; HashMap<String, Object> obj = mapper.readValue(responseBuffer.toString(), typeRef);

  3. 通过以下方式将 Obj 转换为 json,然后再次转换为 YAML:

    JsonElement jsonElem = wrapJacksonObject(obj); String cloudTemplateJsonString = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting()// .create()// .toJson(jsonElem); JsonNode jsonNode = mapper.readTree(cloudTemplateJsonString); String yaml = new YAMLMapper().enable(Feature.MINIMIZE_QUOTES)// .disable(Feature.WRITE_DOC_START_MARKER)// .writeValueAsString(jsonNode);

  4. 检查最后一个字符串后,我看到这些特殊字符已更改/删除(它们在第 2 点之后完全更改(:

    一个。 "转移到"或删除 b. !:关于感叹号:它后面的整个字符串,直到第一个空格被完全删除

    例子:

    Version: !Join ['-', [!Ref GatewayVersion, GW]]
    After Parsing  
    Version:
    - '-'
    - - GatewayVersion
    - GW
    

有时也删除单引号/转换为双引号

AllowedPattern: '^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})/(d{1,2})$'

解析后删除单引号:

AllowedPattern: ^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})/(d{1,2})$
  1. 我尝试使用转义字符自定义 通过自定义 CharacterEscapes 类的实现,但它没有帮助

在 YAML 中,可以在字符串文本等值前面加上指示有关节点的元数据的标记,称为节点属性。以 bang!开头的标记被视为"节点标签",以 & 符号开头的标记&被视为"节点锚点"。

https://yaml.org/spec/1.2/spec.html#id2783797

JSON 没有等效的功能。由于 Jackson 主要是一个 JSON 解析库,因此其结构化数据节点的内部表示没有元数据字段,因此其 YAMLFactory 解析器实现只是丢弃它们。

查看您的 YAML 文件,我希望该文件的预期解析器(aws 的 cloudwatch cli 工具?(会知道如何使用这些!加入和 !引用节点标记以构造版本字段的内部表示形式。

类似地,文本值周围的单引号或双引号被视为标记的一部分(即,使用解析器(而不是值的一部分。因此,解析器丢弃这些字符(在将它们用作如何使用值的指南之后(。在将内部表示形式重新序列化回 YAML 或 JSON 时,可以根据需要添加或不添加引号(双引号或单引号(。

最新更新