July
July

Reputation: 13

Is there a way to get the particular Values from JSON Array using robot or Python code?

JSON OUTPUT:

${response}= [
{
  "Name":"7122Project",
  "checkBy":[
     {
        "keyId":"NA",
        "target":"1232"
     }
  ],
  "Enabled":false,
  "aceess":"123"
},
{
  "Name":"7122Project",
  "checkBy":[
     {
        "keyId":"_GU6S3",
        "target":"123"
     }
  ],
  "aceess":"11222",
  "Enabled":false
},
{
  "Name":"7122Project",
  "checkBy":[
     {
        "keyId":"-1lLUy",
        "target":"e123"
     }
  ],
  "aceess":"123"
}
]

Need to get the keyId values from json without using hardcoded index using robot?

I did

${ID}=    set variable    ${response[0]['checkBy'][0]['keyId']}

But I need to check the length get all keyID values and store the values that dose not contain NA How can I do check length and use for loop using robot framework?

Upvotes: 1

Views: 703

Answers (1)

pavelsaman
pavelsaman

Reputation: 8322

I suppose you can have more elements in checkBy arrays, like so:

response = [
    {
      "Name":"7122Project",
      "checkBy": [
         {
            "keyId": "NA",
            "target": "1232"
         }
      ],
      "Enabled": False,
      "aceess": "123"
    },
    {
      "Name": "7122Project",
      "checkBy": [
         {
            "keyId": "_GUO6g6S3",
            "target": "123"
         }
      ],
      "aceess": "11222",
      "Enabled": False
    },
    {
      "Name": "7122Project",
      "checkBy": [
         {
            "keyId": "-1lLlZOUy",
            "target": "e123"
         },
         {
            "keyId": "test",
            "target": "e123"
         }
      ],
      "aceess": "123"
    }
]

then you can key all keyIds in Python with this code:

def get_key_ids(response):
    checkbys = [x["checkBy"] for x in response]
    key_ids = []

    for check_by in checkbys:
        for key_id in check_by:
            key_ids.append(key_id["keyId"])
    return key_ids

for the example above, it will return: ['NA', '_GUO6g6S3', '-1lLlZOUy', 'test_NA'].

You want to get both ids with NA and without NA, so perhaps you can change the function a bit:

def get_key_ids(response, predicate):
    checkbys = [x["checkBy"] for x in response]
    key_ids = []

    for check_by in checkbys:
        for key_id in check_by:
            if predicate(key_id["keyId"]):
                key_ids.append(key_id["keyId"])
    return key_ids

and use it like so:

get_key_ids(response, lambda id: id == "NA")     # ['NA']
get_key_ids(response, lambda id: id != "NA")     # ['_GUO6g6S3', '-1lLlZOUy', 'test_NA']
get_key_ids(response, lambda id: "NA" in id)     # ['NA', 'test_NA']
get_key_ids(response, lambda id: "NA" not in id) # ['_GUO6g6S3', '-1lLlZOUy']

Now it's just a matter of creating a library and importing it into RF. You can get inspiration in the official documentation.

But I need to check the length get all keyID values and store the values that dose not contain NA

I don't completely understand what you are up to. Do you mean length of keyId strings, like "NA" and its length of 2, or the number of keyIds in the response?

How can I do check length and use for loop using robot framework?

You can use keyword Should Be Equal * from BuiltIn library. Some examples of for loops could be found in the user guide here.

Now you should have all the parts you need to accomplish your task, you can try to put it all together.

Upvotes: 1

Related Questions