Используя лучшее из SnakeYAML и Jackson в scala, я использую следующий метод для анализа файлов YAML. Этот метод поддерживает использование якорей в YAML.
import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import java.io.{File, FileInputStream}
import org.yaml.snakeyaml.{DumperOptions, LoaderOptions, Yaml}
/**
* YAML Parser using SnakeYAML & Jackson Implementation
*
* @param yamlFilePath : Path to the YAML file that has to be parsed
* @return: JsonNode of YAML file
*/
def parseYaml(yamlFilePath: String): JsonNode = {
// Parsing the YAML file with SnakeYAML - since Jackson Parser does not have Anchors and reference support
val ios = new FileInputStream(new File(yamlFilePath))
val loaderOptions = new LoaderOptions
loaderOptions.setAllowDuplicateKeys(false)
val yaml = new Yaml(
loaderOptions
)
val mapper = new ObjectMapper().registerModules(DefaultScalaModule)
val yamlObj = yaml.loadAs(ios, classOf[Any])
// Converting the YAML to Jackson YAML - since it has more flexibility for traversing through nodes
val jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(yamlObj)
val jsonObj = mapper.readTree(jsonString)
println(jsonString)
jsonObj
}
Однако в настоящее время это не поддерживает интерполяцию переменных среды в файле YAML. Например: если мы получим следующие переменные среды, когда мы делаем
>>> println(System.getenv())
{PATH=/usr/bin:/bin:/usr/sbin:/sbin, XPC_FLAGS=0x0, SHELL=/bin/bash}
Вопрос в том, как добиться интерполяции переменных среды в файле yaml, скажем, у нас есть следующий файл YAML:
path_value: ${PATH}
xpc: ${XPC_FLAGS}
shell_path: ${SHELL}
Затем после разбора YAML должно быть:
{
"path_value": "/usr/bin:/bin:/usr/sbin:/sbin",
"xpc": "0x0",
"shell_path": "/bin/bash"
}
Спасибо за ваше время и усилия, чтобы ответить заранее!
String
в форме${...}
, замените его разрешением env. - person sarveshseri   schedule 06.04.2021Constructor
и зарегистрировать пользовательскую реализациюConstruct
дляTag.STR
, чтобы она использовалась для всех узлов, которые будут созданы вString
. Этот ответ показывает код Java; Я недостаточно знаю Scala, чтобы перевести его для вашего варианта использования. - person flyx   schedule 07.04.2021