Как определить, является ли результат выбора () строкой - PullRequest
2 голосов
/ 22 июня 2011

Я использую Goodreads API через источник данных.Я ищу с номером ISBN, и он возвращает результаты, если таковые имеются.Вот как это выглядит, если книга найдена:

<GoodreadsResponse>
    <Request>
        <authentication>true</authentication>
        <key><![CDATA[--redacted--]]></key>
        <method><![CDATA[api_book_url]]></method>
    </Request>
    <book id="6558055">
        <title><![CDATA[Mythical Man-Month, The: Essays on Software Engineering, Anniversary Edition]]></title>
        <isbn><![CDATA[]]></isbn>
        <link>http://www.goodreads.com/book/show/6558055-mythical-man-month-the?utm_medium=api&amp;utm_source=book_link</link>
    </book>
</GoodreadsResponse>

Если книга не найдена, она будет такой же, за исключением того, что раздел <book> отсутствует.Вы можете представить, как выглядит JSON, когда KRL проанализировал этот XML.

Я pick() извлекаю тег link из ответа следующим образом:

url = data.pick("$..link.$t");

Если есть раздел <book>, он работает просто отлично;url будет строкой.Но если не было секции <book>, url будет пустым массивом ([]).

Я хочу, чтобы действия в моем правиле выполнялись, только если url - строка.Я пытался использовать такие вещи, как if url != [] then или url.length() (который всегда равен нулю), но ни одна из них не работает.

Как определить, когда url - строка, а когда - пустая?массив?

1 Ответ

2 голосов
/ 22 июня 2011

Прямой ответ на ваш вопрос: .typeof(), документы здесь .

Пример условия и действия:

if url.typeof() eq 'array' then  
  noop()

Еще один способ справиться с этой ситуациейпередать true в качестве второго аргумента выбора, в результате чего ответ всегда будет массивом.Это описано в документах pick .

Поскольку это всегда будет массив, вы можете использовать .length() для проверки на совпадение.

...