Преобразуйте JSON строку в словарь в ROBOT, используя json .loads () - зачем нужны тройные кавычки? - PullRequest
1 голос
/ 14 апреля 2020

Я читал, что json .loads () может использоваться Robot Framework для преобразования строки JSON в словарь в этом посте: Json обработка в ROBOT

Таким образом, если вы определяете словарную строку, подобную этой:

${json_string}    Set Variable    {"key1": "value1", "key2": "value2", "key3": "value3"}

Вы можете затем использовать следующее, чтобы преобразовать ее в словарь:

${dict}    Evaluate    json.loads('''${json_string}''')    json

Мой вопрос прост - почему здесь нужны тройные кавычки для окружения аргумента?

Если используются одинарные кавычки, выдается исключение, в котором указывается строка:

${dict}    Evaluate    json.loads('${json_string}')    json

(Правка) Выше приведен плохой пример, он действительно работает. Однако, если используются двойные кавычки, он не срабатывает для SyntaxError: неверный синтаксис.

Если кавычки вообще не используются, возникает ошибка, которая указывает, что переменная является словарем - но в Robot это не словарь (TypeError: объект JSON должен быть str, bytes или bytearray, а не dict):

${dict}    Evaluate    json.loads(${json_string})    json

Если преобразование Robot's Convert To String используется в переменной $ {json_string}, а затем передается новая переменная в методе json .loads () возникает та же ошибка TypeError, утверждающая, что должна использоваться строка, а не словарь, но она была преобразована в строку:

${json_string2}    Convert To String    ${json_string}
${dict}    Evaluate    json.loads(${json_string2})    json

Какие тройные кавычки выполняют это не достигаются двумя другими? Кажется, это один из аспектов фреймворка Robot ...

1 Ответ

0 голосов
/ 21 апреля 2020

Я буду go впереди и последую в ответе, так как это проще, я думаю, что ответит на ваш дополнительный вопрос в этом комментарии .

Я не очень знаком с Robot Framework, но если я правильно понимаю все, что он делает в .robot файлах, когда вы используете ${variable}, подстановка представляет собой простой шаблон строки: поэтому, когда вы передаете ${variable} в выражение, независимо от того, какой тип лежит в основе переменной то есть, он всегда заменяет свое строковое представление, поэтому выражение, которое вы пытаетесь вычислить, буквально:

json.loads({'key': "value1', 'key2': 'value2'})

Вот почему вам нужен """ (в принципе вы можете использовать только ", но """ было бы намного безопаснее). Между прочим, если вы преобразовали вышеуказанный dict в стандартное строковое представление в Python, то не будет действительным JSON, потому что JSON требует двойных кавычек, а не одинарных. * Официальная документация немного сбивает с толку и, кажется, противоречит самой себе (я думаю, что она не была написана носителем английского языка Engli sh, что в порядке):

Когда переменная используется в выражении с использованием обычного синтаксиса ${variable}, ее значение заменяется перед вычислением выражения. Это означает, что значение, используемое в выражении, будет строковым представлением значения переменной, а не самого значения переменной. Это не проблема с числами и другими объектами, которые имеют строковое представление, которое может быть оценено непосредственно, но с другими объектами поведение зависит от строкового представления.

Я говорю, что это противоречит само себе, потому что первый говорит "его значение [заменяется] до того, как выражение будет оценено". Но тогда он говорит, что «значение, используемое в выражении, будет строковым представлением значения переменной» (которое не совпадает с самим значением). Последнее объяснение кажется правильным, однако.

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

Начиная с Robot Framework 2.9, сами переменные автоматически доступны в пространстве имен оценки. Доступ к ним можно получить с помощью специального синтаксиса переменных без фигурных скобок, таких как $variable. Эти переменные никогда не должны заключаться в кавычки, и на самом деле они даже не заменяются внутри строк.

Но в вашем случае вы написали:

${json_string}    Set Variable    {"key1": "value1", "key2": "value2", "key3": "value3"}

Как я понимаю "Установить переменную msgstr "просто сохраняет значение как строковый литерал. Так что, на самом деле, этого должно быть достаточно для запуска (как вы сделали):

${dict}    Evaluate    json.loads('''${json_string}''')    json

В вашем последнем примере «Преобразовать в строку» ничего не делает, потому что, как вы написали, ${json_string} уже заменяет собой строку. Вам просто нужно понять, что результатом json.loads(${json_string}) является выражение Python, где ${json_string} просто заменяется содержимым этой переменной шаблона - это не то же самое, что передача значения str в json.loads(). Последнее, я полагаю, может быть достигнуто, по крайней мере,

${dict}    Evaluate    json.loads($json_string)    json

, проходя мимо документов. Но я не проверял это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...