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 处理动态元素

Robot Framework Regular Expression 正则表达式 处理String

如何使用Robot + Linux在json文件中以UTC(Zulu UTC)格式替换当前时间?

15.find查找命令《Mr.Robot》

RobotSobelScharr算子

Robot Framework 字符串分隔