我在将 ObjectMapper 与 YAMLFactory 一起使用解析 YAML 文件时遇到问题
- 我正在尝试解析的 YAML 文件:https://drive.google.com/open?id=1Q85OmjH-IAIkordikLTsC1oQVTg8ggc8
-
使用 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);
-
通过以下方式将 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);
-
检查最后一个字符串后,我看到这些特殊字符已更改/删除(它们在第 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})$
- 我尝试使用转义字符自定义 通过自定义 CharacterEscapes 类的实现,但它没有帮助
在 YAML 中,可以在字符串文本等值前面加上指示有关节点的元数据的标记,称为节点属性。以 bang!
开头的标记被视为"节点标签",以 & 符号开头的标记&
被视为"节点锚点"。
https://yaml.org/spec/1.2/spec.html#id2783797
JSON 没有等效的功能。由于 Jackson 主要是一个 JSON 解析库,因此其结构化数据节点的内部表示没有元数据字段,因此其 YAMLFactory 解析器实现只是丢弃它们。
查看您的 YAML 文件,我希望该文件的预期解析器(aws 的 cloudwatch cli 工具?(会知道如何使用这些!加入和 !引用节点标记以构造版本字段的内部表示形式。
类似地,文本值周围的单引号或双引号被视为标记的一部分(即,使用解析器(而不是值的一部分。因此,解析器丢弃这些字符(在将它们用作如何使用值的指南之后(。在将内部表示形式重新序列化回 YAML 或 JSON 时,可以根据需要添加或不添加引号(双引号或单引号(。