ROBOT 中的 Json 处理
Posted
技术标签:
【中文标题】ROBOT 中的 Json 处理【英文标题】:Json handling in ROBOT 【发布时间】:2016-05-17 16:15:09 【问题描述】:我有一个 Json 文件,其中有一个字段,我需要编辑并保存该文件以供下次使用。
但是我需要编辑的字段如下图,
我需要为该字段分配的值是在运行时随机生成的,我将在一个变量中捕获它并将其传递给这个 json 特定键“dp”,然后保存 json。
保存的 json 将用于 REST POST url。
"p": "10",
"v": 100,
"vt": [
"dp": "Field to be edited"(integer value) ,
]
【问题讨论】:
对不起,我无法得到你。 你写过代码来尝试完成你想做的事吗? 不,我没试过。当我使用 ROBOT 框架时,我尝试使用 ace 之类的工具,它会在运行时更改 json。但我需要一个内置的 API / 代码片段来更新特定的键值。 你知道如何用python写代码,还是需要一个不涉及写代码的解决方案? 您在问题中发布了无效的 json 数据。你有一个左方括号,一个左大括号,然后一个右方括号 【参考方案1】:最简单的解决方案是编写一个可以为您更改值的 python 关键字。但是,您可以通过执行以下步骤使用机器人关键字解决此问题:
-
将 JSON 字符串转换为字典
修改词典
将字典转换回 JSON 字符串
将 JSON 字符串转换为字典
Python 有一个模块 (json) 用于处理 JSON 数据。您可以使用该模块的loads(加载字符串)方法使用evaluate 关键字将您的JSON 字符串转换为python 字典。
假设您的 JSON 数据位于名为 $json_string
的机器人变量中,您可以将其转换为 Python 字典,如下所示:
$json= evaluate json.loads('''$json_string''') json
通过上述内容,$json
现在拥有对包含所有 json 数据的字典的引用。
修改字典
robot 附带的Collections 库有一个名为set to dictionary 的关键字,可用于设置字典元素的值。在这种情况下,您需要更改嵌套在 JSON 对象的 vt
元素内的字典的值。我们可以使用机器人的extended variable syntax 引用那个嵌套字典。
例如:
set to dictionary $json["vt"] dp=the new value
这样,$json
现在有了新值。但是,它仍然是一个 python 字典而不是 JSON 数据,所以还有一步。
将字典转换回 JSON
将字典转换回 JSON 与第一步相反。即使用json模块的dumps(dump string)方法:
$json_string= evaluate json.dumps($json) json
这样,$json_string
将包含一个有效的 JSON 字符串以及修改后的数据。
完整示例
以下是一个完整的工作示例。 JSON字符串将在替换新值之前和之后打印:
*** Settings ***
Library Collections
*** Test Cases ***
Example
$json_string= catenate
...
... "p": "10",
... "v": 100,
... "vt":
... "dp": "Field to be edited"
...
...
log to console \nOriginal JSON:\n$json_string
$json= evaluate json.loads('''$json_string''') json
set to dictionary $json["vt"] dp=the new value
$json_string= evaluate json.dumps($json) json
log to console \nNew JSON string:\n$json_string
【讨论】:
很抱歉劫持 Bryan,这与我即将解决的问题相似。看来这可以满足我的需要,我假设从字典关键字中删除保留了 json 文档结构而没有太多有意的想法?我还假设如果密钥已经存在,set to dictionary 将更新,但如果它不存在则添加?再次为劫持道歉,我认为我不应该添加我自己的问题,因为它是如此密切相关 @shicky:回答你的问题的最好方法是让你试试看。您提出的所有问题,只需几行代码即可轻松回答。 这当然是真的 Bryan,希望这周或下周能腾出一些时间来完成它。感谢您的意见 这是一个很好的答案。在简单的情况下,您甚至不需要使用json
模块,因为简单的 JSON 结构在 Python 中也有效,您只需使用 | $json = | Evaluate | $json_string |
。转换回字符串应该可以使用| $json_string = | Convert To String | $json |
。
@PekkaKlärck 不太正确,因为true
在 json 中有效,但在 Python 中无效(必须为 True
)【参考方案2】:
为了在文件中读取和写入数据,我正在使用操作系统库
$json Get Binary File $json_pathnameOfJsonFile.json
它适用于我的 API 测试,读取 .json 和 POST,就像这里
*** Settings ***
Library Collections
Library ExtendedRequestsLibrary
Library OperatingSystem
*** Variables ***
$uri https://blabla.com/service/
$json_path C:/home/user/project/src/json/
*** Test Cases ***
Robot Test Case
Create Session alias $uri
&headers Create Dictionary Content-Type=application/json; charset=utf-8
$json Get Binary File $json_pathnameOfJsonFile.json
$resp Post Request alias data=$json headers=$headers
Should Be Equal As Strings $resp.status_code 200
【讨论】:
shiftB 是什么意思?data=$shiftB
在我的例子中,它是关于班次开始、时间、日期等的数据 $shiftB 获取二进制文件 $json_pathaddShiftBeginn.json【参考方案3】:
对于 JSON 中的整数值,其他答案对我不起作用。 这有效:
$json= Catenate "p": "10", "v": 100, "vt": "dp": "Field to be edited"
$value Set Variable 2 #the value you want
$value Convert To Integer $value
$json= Evaluate json.loads('''$json''') json
Set To Dictionary $json["vt"] dp=$value
$json= Evaluate json.dumps($json) json
Log $json
需要转换为整数,否则该值仍在字符串“$value”中
【讨论】:
以上是关于ROBOT 中的 Json 处理的主要内容,如果未能解决你的问题,请参考以下文章
Robot Framework Regular Expression 正则表达式 处理String