4

我正在用 Ruby 解析 YAML 文件,其中一些输入导致 Psych 语法错误:

require 'yaml'

example = "my_key: [string] string"
YAML.load(example)

导致:

Psych::SyntaxError: (<unknown>): did not find expected key
          while parsing a block mapping at line 1 column 1
from [...]/psych.rb:456:in `parse'

我从一个我无法控制的外部 API 收到了这个 YAML。我可以看到编辑输入以强制解析为字符串,使用my_key: '[string] string',如“我需要 YAML 中的字符串的引号吗? ”中所述,可以解决问题,但我无法控制如何接收输入。

有没有办法强制将输入解析为某些键的字符串,例如 my_key?是否有成功解析此 YAML 的解决方法?

4

3 回答 3

4

一种方法是在将响应读取为 YAML 之前对其进行处理。假设它是一个字符串,您可以使用正则表达式将有问题的模式替换为有效的模式。IE

resp_str = "---\nmy_key: [string] string\n"
re = /(\: )(\[[a-z]*?\] [a-z]*?)(\n)/
resp_str.gsub!(re, "#{$1}'#{$2}'#{$3}")
#=> "---\n" + "my_key: '[string] string'\n"

然后你可以做

YAML.load(resp_str)
#=> {"my_key"=>"[string] string"}
于 2020-01-02T21:54:14.497 回答
3

它不起作用,因为方括号在 YAML 中具有特殊含义,表示数组:

YAML.load "my_key: [string]"
#⇒ {"my_key"=>["string"]}

并且[foo] bar是无效类型。应该明确地转义方括号

YAML.load "my_key: \\[string\\] string"
#⇒ {"my_key"=>"\\[string\\] string"}

此外,还可以实现自定义Psych解析器

于 2020-01-02T12:41:39.897 回答
-1

有非常原生和简单的解决方案。如果你想有字符串上下文,你总是可以在它周围加上引号:

 YAML.load "my_key: '[string]'"
=> {"my_key"=>"[string]"}
于 2020-01-02T13:05:42.787 回答