2016-12-15 2 views
-1

У меня есть некоторые данные, которые будут использоваться для генерации SQL, поэтому важно, какие текстовые разделители используются (одинарные кавычки «ограничивают строковый литерал», но двойные кавычки "разграничить идентификаторы, по крайней мере, в Oracle DB)Сохранять текстовые разделители после !! str «некоторый текст» или !! str «некоторый текст»

Для процедуры нагрузки генератора я использовал этот

someKey: !!str 'Some SQL text' 

и ожидается, что someKey будет содержать всю строку, включая одинарные кавычки:.. 'Some SQL text'

Однако js-yaml.safeLoad() interp rets данные как Some SQL text, который не то, что я хотел.

Обходной легко, я могу поставить буквальным в дополнительные кавычки:

someKey: "'Some SQL text'" 

который дает ожидаемый результат. Тем не менее, я не совсем уверен, почему в этом случае нам нужен! Str-тег в YAML, если он фактически ничего не делает (он полезен только для явных букв интерпретации, true, false и null), и на самом деле это почти то же самое, что и ставя двойные кавычки вокруг текста.

Я бы предпочел опубликовать это в каком-нибудь форуме, посвященном YAML-spec, но, похоже, его нет.

Помимо стандартного обходного пути, есть ли какой-либо трюк, который будет делать то, что я изначально хотел, т. Е. Интерпретировать любое содержимое после ключа объекта как строку (+ обрезание любых начальных и конечных пробелов) без использования двойных кавычек?

+0

Причины, почему мне нужно это: –

+0

Причиной, почему мне это нужно: - ключевой объекта является именем выходного столбца (псевдоним) - значение представляет собой выражение, которое должно быть присвоено этому столбцу. Теперь строительство, как это: колонок: «ПОЛНЫЙ» означает, что я хочу Asign строковой константы 'FULL' в колонке' column' в то время как колонка: ПОЛНЫЙ следует интерпретировать как «присвоить значение идентификатора ПОЛНОГО в колонку' столбец ", где FULL может быть столбцом, переменной, функцией и т. д. К сожалению, спецификация YAML интерпретирует оба из них как ** FULL **, что в некотором смысле является потерей информации, в данном случае значимой. –

+1

Существует список рассылки yaml и обратите внимание, что [so] не является форумом, а сайтом Q & A. – Anthon

ответ

2

В теге YAML !!str является преднамеренным обозначением строкового скаляра. Если вы укажете, что тогда даже те вещи, которые без этого тега (или без кавычек), не будут считаться строковым скаляром, например 123, True или null.

Некоторые скаляры строк нуждаются в котировках, например. если они начинаются с цитаты или двойной кавычки, если специальные символы нуждаются в обратном сбрасывании, или если в строке есть : (двоеточие, пробел) (что может смутить синтаксический анализатор для того, чтобы интрепретировать скаляр в виде пары ключ-значение.

Однако положить !!str, прежде чем что-то не делает его цитировали (что должно быть очевидно, как он не определяет, какое Цитирование и одинарные кавычки скаляров имеет совершенно разные правила от двойных кавычек скаляров).

Вашего временное решения а не обходным путем, это только один из способов в YAML, вы можете указать строковый скаляр, который начинается и заканчивается одной цитатой. Другой способ:

someKey: |- 
    'Some SQL text' 

В каскадах скаляров в стиле буквенного блока (один или два) интерпретируются так же, как и в начале скаляра. - гарантирует, что вы не получаете дополнительный символ новой строки после последней '