[ Can't access dictionary with dot notation in Robotframework ]
I have embedded dictionaries like this:
${json}= Create Dictionary ......(value pairs)
${request}= Create Dictionary body=${json}
${return}= Create Dictionary request=${request}
I can access original key-value pairs like for example this:
${return.request.body.type}
It all works fine. However, I get this error:
Resolving variable '${detail_call.response.json.type}' failed: AttributeError: 'dict' object has no attribute 'type'
When I try to create the initial json object vice-versa - by decoding it from string like this:
${decoded_json}= Run Keyword And Ignore Error json.JSONDecoder.Decode ${response.content}
${response.json}= Set Variable If '${decode_status}' == 'PASS' ${decoded_json} ${null}
${detail_call}= Create Dictionary response=${response}
and accessing it via dot notation:
${detail_call.response.json.type}
When I log the string, I can clearly see there is key "type" with a value assigned. It even works when I access it with brackets:
${detail_call.response.json['type']}
Do you have any idea, why I can't use dot notation if the dictionary was created with JSONDecoder?
Thanks.
Answer 1
As millimoose suggested, JSONDecoder returns python dictionary which is different from robotframework's own dictionary. I haven't found official way to convert python dict to robot dict so I have implemented my own:
Convert Python Dictionary
[Arguments] ${python_dict}
[Documentation] Converts Python dictionary to Robot dictionary.
@{keys}= Get Dictionary Keys ${python_dict}
${robot_dict}= Create Dictionary
:FOR ${key} IN @{keys}
\ Set To Dictionary ${robot_dict} ${key}=${python_dict['${key}']}
[Return] ${robot_dict}
In case you need to convert robot dict to python dict, you can use Convert To Dictionary keyword from Collections library (http://robotframework.org/robotframework/latest/libraries/Collections.html#Convert%20To%20Dictionary).