Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
681 views
in Technique[技术] by (71.8m points)

robotframework - Json handling in ROBOT

I have a Json file in which there is a field which I need to edit and save the file for next usage.

But the field which I need to edit is as shown below,

The value I need to assign fr the field is generated Randomly in run time which i'll be capturing in a variable and pass it to this json specific key "dp" then save the json.

The saved json will be used for REST POST url.

            {
                "p": "10",
                "v": 100,
                "vt": [
                    {
                        "dp": "Field to be edited"(integer value) , 
                  ]          
            }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The simplest solution would be to write a python keyword that can change the value for you. However, you can solve this with robot keywords by performing the following steps:

  1. convert the JSON string to a dictionary
  2. modify the dictionary
  3. convert the dictionary back to a JSON string

Convert the JSON string to a dictionary

Python has a module (json) for working with JSON data. You can use the evaluate keyword to convert your JSON string to a python dictionary using the loads (load string) method of that module.

Assuming your JSON data is in a robot variable named ${json_string}, you can convert it to a python dictionary like this:

${json}=    evaluate    json.loads('''${json_string}''')    json

With the above, ${json} now holds a reference to a dictionary that contains all of the json data.

Modify the dictionary

The Collections library that comes with robot has a keyword named set to dictionary which can be used to set the value of a dictionary element. In this case, you need to change the value of a dictionary nested inside the vt element of the JSON object. We can reference that nested dictionary using robot's extended variable syntax.

For example:

set to dictionary    ${json["vt"]}    dp=the new value

With that, ${json} now has the new value. However, it is still a python dictionary rather than JSON data, so there's one more step.

Convert the dictionary back to JSON

Converting the dictionary back to JSON is the reverse of the first step. Namely, use the dumps (dump string) method of the json module:

${json_string}=    evaluate    json.dumps(${json})    json

With that, ${json_string} will contain a valid JSON string with the modified data.


Complete example

The following is a complete working example. The JSON string will be printed before and after the substitution of the new value:

*** Settings ***
Library    Collections

*** Test Cases ***
Example
    ${json_string}=    catenate
    ...  {
    ...    "p": "10",
    ...    "v": 100,
    ...    "vt": {
    ...            "dp": "Field to be edited"
    ...          }
    ...  }

    log to console       
Original JSON:
${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       
New JSON string:
${json_string}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...