Как избежать символа '@' внутри ключа строкового литерала для поискового запроса jmespath

Я использую jmespath для поиска фрагмента JSON, и один из ключей JSON содержит символ '@'. Поскольку символ '@' является зарезервированным символом, jmespath задыхается. Я безуспешно пробовал несколько способов избежать символа «@». Как мне избежать символа '@' в моем поиске jmespath?

Пример:

json = {"@name": "Bob", "address": "123 Main St"}

jmespath.search("@name", json)

Сообщение об ошибке:

{ParseError} Неожиданный токен: имя: ошибка синтаксического анализа в столбце 1, токен "имя" (UNQUOTED_IDENTIFIER), для выражения: "@name" ^

Я также пробовал следующие варианты для указанного выше запроса jmespath с той же ошибкой:

jmespath.search("!@name", json)
jmespath.search("\@name", json)
jmespath.search("`@`name", json)
jmespath.search("\"@\"name", json)

person Brandon Johnson    schedule 11.09.2019    source источник


Ответы (1)


Я нашел правильный способ избежать этого:

jmespath.search("\"@name\"", json)

По моему опыту работы с JMESPath, некоторые атрибуты объекта должны быть заключены в двойные кавычки, например, если у меня есть объект {"0": "txt", "name": "txt2"}, я могу получить доступ к значению имени с помощью этой команды @.name, но для значения 0 мне нужно заключить в двойные кавычки ноль. Я не могу этого сделать @.0 (не работает), но добавление двойных кавычек работает @."0". Вероятно, поэтому JMESPath не позволяет двойным кавычкам определять строку. Это тот же случай, когда вы помещаете в атрибут определенные специальные символы. В Python запрос уже является строкой, поэтому вам нужно добавить дополнительные кавычки и избежать внутренних кавычек \", чтобы решить эту проблему.

В JavaScript такого же результата можно добиться с помощью '"@name"'.

person Brandon Johnson    schedule 11.09.2019