YAML:解析包含方括号作为第一个字符的字符串时出错
YAML: error parsing a string containing a square bracket as its first character
我正在 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'
,如“Do I need quotes for strings in YAML?”中所述,修复了问题,但我不控制接收输入的方式。
有没有办法强制将输入解析为某些键的字符串,例如 my_key
?是否有成功解析此 YAML 的解决方法?
它不起作用,因为方括号在 YAML 中有特殊含义,表示数组:
YAML.load "my_key: [string]"
#⇒ {"my_key"=>["string"]}
和 [foo] bar
是无效类型。应该显式转义方括号
YAML.load "my_key: \[string\] string"
#⇒ {"my_key"=>"\[string\] string"}
此外,可以实施自定义 Psych
parser。
有非常原生和简单的解决方案。如果你想要字符串上下文,你总是可以在它周围加上引号:
YAML.load "my_key: '[string]'"
=> {"my_key"=>"[string]"}
一种方法是在将响应读取为 YAML 之前对其进行处理。假设它是一个字符串,您可以使用正则表达式将有问题的模式替换为有效的模式。即
resp_str = "---\nmy_key: [string] string\n"
re = /(\: )(\[[a-z]*?\] [a-z]*?)(\n)/
resp_str.gsub!(re, "#{}'#{}'#{}")
#=> "---\n" + "my_key: '[string] string'\n"
那你可以做
YAML.load(resp_str)
#=> {"my_key"=>"[string] string"}
我正在 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'
,如“Do I need quotes for strings in YAML?”中所述,修复了问题,但我不控制接收输入的方式。
有没有办法强制将输入解析为某些键的字符串,例如 my_key
?是否有成功解析此 YAML 的解决方法?
它不起作用,因为方括号在 YAML 中有特殊含义,表示数组:
YAML.load "my_key: [string]"
#⇒ {"my_key"=>["string"]}
和 [foo] bar
是无效类型。应该显式转义方括号
YAML.load "my_key: \[string\] string"
#⇒ {"my_key"=>"\[string\] string"}
此外,可以实施自定义 Psych
parser。
有非常原生和简单的解决方案。如果你想要字符串上下文,你总是可以在它周围加上引号:
YAML.load "my_key: '[string]'"
=> {"my_key"=>"[string]"}
一种方法是在将响应读取为 YAML 之前对其进行处理。假设它是一个字符串,您可以使用正则表达式将有问题的模式替换为有效的模式。即
resp_str = "---\nmy_key: [string] string\n"
re = /(\: )(\[[a-z]*?\] [a-z]*?)(\n)/
resp_str.gsub!(re, "#{}'#{}'#{}")
#=> "---\n" + "my_key: '[string] string'\n"
那你可以做
YAML.load(resp_str)
#=> {"my_key"=>"[string] string"}