我有一些数据用于生成SQL,因此使用哪些文本分隔符很重要(单引号'分隔字符串文字但双引号“分隔标识符,至少在Oracle数据库中)。
对于加载程序生成器,我使用了这个
someKey: !!str 'Some SQL text'
并且期望someKey包含整个字符串,包括单引号:'Some SQL text'
。
然而,js-yaml.safeLoad()将数据解释为Some SQL text
,这不是我想要的。
解决方法很简单,我可以将文字放入其他引号:
someKey: "'Some SQL text'"
给出了预期的结果。但是,我不太清楚为什么在这种情况下我们需要在YAML中使用!! str标签,如果它实际上什么都没有(它仅对显式解释数字文字,真,假和空有用),它实际上几乎是相同的在文本周围加上双引号。
我更愿意将其发布到与YAML规范相关的论坛中,但似乎没有。
除了标准的解决方法之外,是否有任何技巧可以做我原本想要的,即将对象键之后的任何内容解释为字符串(+修剪任何初始和尾随空格)而不处理双引号?
答案 0 :(得分:3)
在YAML标记中,!!str
是表示字符串标量的预先标记。如果您指定那么即使没有该标记(或没有引号)的内容也不会被视为字符串标量,例如123
,True
或null
。
某些字符串标量需要引用,例如如果他们以引号或双引号开头,如果特殊字符需要反斜杠,或者字符串中有:
(冒号,空格)(这可能会混淆解析器将字符串标量作为关键字 - 价值对。
然而,将!!str
放在某些内容之前并不能引用它(这应该是显而易见的,因为它没有定义什么样的引用和单引号标量与双引号标量有很大不同的规则)
您的解决方法不是解决方法,这只是YAML中的一种方法,您可以指定以单引号开头和结尾的字符串标量。另一种方式是:
someKey: |-
'Some SQL text'
在文字块样式标量中,引号(单引号或双引号)被解释为即使在标量的开头。 -
确保您在最终'